如何使用Moq Framework在单个单元测试中设置查询和非查询? (例如:Autofac)

时间:2018-02-01 10:05:36

标签: c# mocking moq autofac

我想我错过了什么。

Autofac Moqgeneral Moq,我了解到我可以在单个单元测试中设置查询或非查询。这是我的代码:

非查询

var repo = mock.Mock<IRepository>();

repo.Setup(a => a.AddRange(It.IsAny<IEnumerable<MyModel>>()));
...
repo.Verify(a => a.AddRange(It.IsAny<IEnumerable<MyModel>>()));

查询

mock.Mock<IRepository>().Setup(a => a.Get(...)).Returns((new List<MyModel>(){});
var service = mock.Create<MyService>();
var mockResult = service.Get();...

所以,基本上一切正常。但是,如果我想在单个单元测试中实现两者,该怎么办?问的原因是,我的表有大约30列,我想验证每一列与插入的值匹配。从非查询中的示例来看,它只能是Verify&#39;有插入的东西,但没有插入值。

如何以一种方式进行设置,我能够验证插入的值? (对于每一栏)

P.S:

归功于@benjrb的回答

基本上我想问的是,在单个单元测试中,如何验证插入的记录是否与我后来的记录相同?

使用It.Is会有所帮助。示例代码:

  var mockData = new MyModel() { id = 1, code = "c1", value = 5};
  var service = mock.Create<MyService>();
  service.Create(mockData);
  var mockRepo = mock.Mock<IRepo>();
  mockRepo.Verify(a => a.Add(It.Is<MyModel>(b => b.id == 1)));

请注意,我实际上无需调用“获取”功能进行验证,而是通过“添加”功能进行验证。功能

1 个答案:

答案 0 :(得分:1)

如果您愿意,可以使用It.Is代替It.IsAny通过链接It.Is<IEnumerable<Foo>>(x => x.All(y => y.Column1 == "bar"))为所有30列声明值y.Column1 == "bar" && y.Column2 == 1 &&...的值。它将验证您的方法是否使用与表达式蓝图匹配的对象而不是该类型的任何对象进行调用。

如果您正在使用Entity Framework,有更好的方法可以为您的存储库模拟DbSet。我会看看像https://msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx这样的东西。看看你是否对服务或存储库进行单元测试,你可能会在这里混淆他们的责任。