Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何模拟进行相同查询但返回列表不同部分的两个数据库调用_C#_Unit Testing_Mocking - Fatal编程技术网

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()

我正在对一些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();
[测试]
_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();