小编Grz*_*ski的帖子

我可以使用moq的InSequence()和MockBehavior.Loose吗?

我试图执行后续调用验证,我发现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.

c# moq mocking

9
推荐指数
1
解决办法
2775
查看次数

AutoFixture Likeness - 仅比较匹配的属性

我希望能够使用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类添加一个新成员时,我都要纠正我的单元测试(或者至少是单元测试助手).

有没有办法说"我想比较两个对象中存在的子集的相似性"?

c# unit-testing autofixture

7
推荐指数
1
解决办法
1582
查看次数

使用例如Moq和AutoFixture创建模拟和匿名对象的混合体?

我在工作期间遇到的课程如下:

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)

c# moq mocking anonymous-objects autofixture

6
推荐指数
1
解决办法
1433
查看次数

OpenCover - 如何查看每次测试的覆盖率?

OpenCover github页面上,我可以看到OpenCover支持测试覆盖("版本3(测试支持覆盖,调试符号").问题是,我不知道如何使用此选项运行OpenCover.我的工作流程是运行使用OpenCover和nUnit进行单元测试,然后使用ReportGenerator生成完整的html报告并查看它 - 我无法在任何地方看到"测试覆盖率".

或者也许我得到了"测试覆盖"功能错误?我怎么想象这个功能是我可以得到一个问题的答案,比如"我的TestXYZ(包括哪些代码行?").

谁能给我一些关于如何使用该功能的提示?

c# code-coverage opencover

3
推荐指数
1
解决办法
1604
查看次数