我试图执行后续调用验证,我发现moq支持InSequence()方法,如:
MockSequence s = new MockSequence();
validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true);
encryptor.InSequence(s).Setup(m=>m.Encrypt(It.IsAny<Frame>()));
socket.InSequence(s).Setup(m => m.Send(It.IsAny<Frame>()));
compressor.InSequence(s).Setup(m => m.Compress(It.IsAny<Frame>()));
Run Code Online (Sandbox Code Playgroud)
但是,这似乎仅在我将模拟行为指定为"严格"时才起作用,这禁止我在模拟对象上调用其他方法.但是,我希望能够在这些对象上调用其他方法,我只是希望这些调用按顺序执行.
是否有任何"支持"的方式(而不是诉诸.Callback()和手工实现)?我找到了一个名为moq.sequence的附加库,但是,预编译版本不适用于最新的Moq.
我希望能够使用AutoFixture.SemanticComparison比较以下两个对象的相似性:
public class Object1
{
public int a;
}
public class Object2
{
public int a;
public int b;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我这样做的时候:
var o1 = new Object1 { a = 1 };
var o2 = new Object2 { a = 1, b = 2};
o1.AsSource().OfLikeness<Object2>().ShouldEqual(o2);
Run Code Online (Sandbox Code Playgroud)
我得到以下例外:"以下成员不匹配: - b."
我发现我可以省略'b'成员,如下所示:
var o1 = new Object1 { a = 1 };
var o2 = new Object2 { a = 1, b = 2};
o1.AsSource().OfLikeness<Object2>().Without(object2 => object2.b).ShouldEqual(o2);
Run Code Online (Sandbox Code Playgroud)
但是,我发现这很麻烦,因为每当我向Object2类添加一个新成员时,我都要纠正我的单元测试(或者至少是单元测试助手).
有没有办法说"我想比较两个对象中存在的子集的相似性"?
我在工作期间遇到的课程如下:
public class MyObject
{
public int? A {get; set;}
public int? B {get; set;}
public int? C {get; set;}
public virtual int? GetSomeValue()
{
//simplified behavior:
return A ?? B ?? C;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我有一些代码可以访问A,B和C并调用GetSomeValue()方法(现在,我认为这不是一个好的设计,但有时我的双手并列;-)).我想创建一个这个对象的模拟,同时将A,B和C设置为某些值.所以,当我使用moq时:
var m = new Mock<MyObject>() { DefaultValue = DefaultValue.Mock };
Run Code Online (Sandbox Code Playgroud)
让我在GetSomeValue()方法上设置一个结果,但所有属性都设置为null(使用Setup()设置所有属性非常麻烦,因为真实对象是一个讨厌的数据对象,并且具有比上面更多的属性简化的例子).
所以另一方面,使用像这样的AutoFixture:
var fixture = new Fixture();
var anyMyObject = fixture.CreateAnonymous<MyObject>();
Run Code Online (Sandbox Code Playgroud)
让我无法对GetSomeValue()方法进行调用.
有没有办法将两者结合起来,拥有匿名值和设置呼叫结果的能力?
编辑
根据nemesv的答案,我推导出以下实用方法(希望我做对了):
public static Mock<T> AnonymousMock<T>() where T : class
{
var mock = new Mock<T>();
fixture.Customize<T>(c => c.FromFactory(() => mock.Object)); …
Run Code Online (Sandbox Code Playgroud) 在OpenCover github页面上,我可以看到OpenCover支持测试覆盖("版本3(测试支持覆盖,调试符号").问题是,我不知道如何使用此选项运行OpenCover.我的工作流程是运行使用OpenCover和nUnit进行单元测试,然后使用ReportGenerator生成完整的html报告并查看它 - 我无法在任何地方看到"测试覆盖率".
或者也许我得到了"测试覆盖"功能错误?我怎么想象这个功能是我可以得到一个问题的答案,比如"我的TestXYZ(包括哪些代码行?").
谁能给我一些关于如何使用该功能的提示?