c# – 用Moq嘲笑代表

c# – 用Moq嘲笑代表,第1张

概述我有一个界面: public interface IRepeater{ void Each(string path, Action<string> action);} 我想用Moq模拟这个界面.现在我可以做到以下几点: var mock = new Mock<IRepeater>();mock.Setup(m => m.Each(It.IsAny<string>(), It.IsAn 我有一个界面:
public interface IRepeater{    voID Each(string path,Action<string> action);}

我想用Moq模拟这个界面.现在我可以做到以下几点:

var mock = new Mock<IRepeater>();mock.Setup(m => m.Each(It.IsAny<string>(),It.IsAny<Action<string>>());

但是,为了帮助测试,我希望能够模拟传递给Action< string>的字符串.这可以用Moq完成吗?如果有,怎么样?

更新

为了澄清我正在测试一个依赖于IRepeater的不同类.我想模拟IRepeater.Each所以我可以控制Action获取的字符串,以便我可以测试行为.

所以,如果我有这样的课程.

public class Service{    private Readonly IRepeater _repeater;    public Service(IRepeater repeater)    {        _repeater = repeater;    }    public string Parse(string path)    {        var builder = new StringBuilder();        _repeater.Each(path,line => builder.Append(line));        return builder.ToString();    }}

我如何模拟IRepeater.Each以便我可以测试Service.Parse?

解决方法 你必须使用回调方法.由于line => builder.Append(line)是方法行为的一部分,在测试方法时必须执行此行为:
[TestMethod]    public voID Test_Service_When_Passing_String_And_ActionDelegate()    {        var fakeReporter = new Mock<IRepeater>();        fakeReporter.Setup(x => x.Each(It.IsAny<string>(),It.IsAny<Action<string>>()))            .Callback<string,Action<string>>((s,action) => action(s));        var target = new Service(fakeReporter.Object);        var result = target.Parse("asdfghj");        Assert.AreEqual("asdfghj",result);    }

测试此方法的另一种方法是验证使用正确的路径调用方法,然后验证 *** 作是否是正确的 *** 作:

[TestMethod]    public voID Test_Service_When_Passing_String_And_ActionDelegate()    {        var fakeReporter = new Mock<IRepeater>();        fakeReporter.Setup(x => x.Each(It.IsAny<string>(),action) =>            {                Assert.AreEqual("asdfghj",s);                foreach (var w in "pass")                {                    action(w.ToString());                }            });        var target = new Service(fakeReporter.Object);        var result = target.Parse("asdfghj");        Assert.AreEqual("pass",result);    }

顺便说一下,你可以用字符串替换It.IsAny< string>(),然后删除Assert.AreEqual(“asdfghj”,s);(我只想以明确的方式测试事物……)

总结

以上是内存溢出为你收集整理的c# – 用Moq嘲笑代表全部内容,希望文章能够帮你解决c# – 用Moq嘲笑代表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1262838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存