C# 如何模拟进行相同查询但返回列表不同部分的两个数据库调用
我正在对一些c#代码进行单元测试,我必须使用相同的模拟,但返回不同的值。例如,我想在单元测试中执行以下操作:C# 如何模拟进行相同查询但返回列表不同部分的两个数据库调用,c#,unit-testing,mocking,C#,Unit Testing,Mocking,我正在对一些c#代码进行单元测试,我必须使用相同的模拟,但返回不同的值。例如,我想在单元测试中执行以下操作: [Test] _mockDatabase.Setup(x => x.Query(It.IsAny<Filter>())).Returns(List[0]).Verifiable(); _mockDatabase.Setup(x => x.Query(It.IsAny<Filter>())).Returns(List[1]).Verifiable()
[Test]
_mockDatabase.Setup(x => x.Query(It.IsAny<Filter>())).Returns(List[0]).Verifiable();
_mockDatabase.Setup(x => x.Query(It.IsAny<Filter>())).Returns(List[1]).Verifiable();
[测试]
_mockDatabase.Setup(x=>x.Query(It.IsAny())。返回(列表[0])。可验证();
_mockDatabase.Setup(x=>x.Query(It.IsAny())。返回(列表[1])。可验证();
有没有一种方法可以在不改变我的实际代码的情况下解决这个问题。这通常可以通过使用
队列
类来解决(注意堆栈
和类似的数据结构也可以工作):
var queue=new queue(new[]{“第一次查询”,“第二次查询”});
//您只需要一个安装呼叫
_模拟数据库
.Setup(x=>x.Query(It.IsAny()))
.Returns(()=>queue.Dequeue())
.可验证();
对
Query
的每个后续调用都将从队列中取出当前元素。调用上面的mock两次,将产生“第一次查询”和“第二次查询”。为什么“必须使用相同的mock”?因为我想调用相同的函数。对不起,我还是单元测试新手。我可以为被调用的同一个函数创建一个单独的模拟吗?如果您想获得两个不同的模拟返回值,可以创建两个模拟,或者不使用It.IsAny
设置Query()
,而是将其设置为从两个不同的过滤器参数返回两个不同的返回值。
var queue = new Queue<string>(new [] { "First query", "Second query" });
// You only need 1 setup call
_mockDatabase
.Setup(x => x.Query(It.IsAny<Filter>()))
.Returns(() => queue.Dequeue())
.Verifiable();