Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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_Testing_Moq - Fatal编程技术网

C# 验证正在调用的函数参数是否具有特定值

C# 验证正在调用的函数参数是否具有特定值,c#,unit-testing,testing,moq,C#,Unit Testing,Testing,Moq,基本上我有一个函数 public Task CustomerUpdate(string user, JObject jobject) { ... JObject newDocument = JObject.FromObject(jobject); newDocument["lastUpdate"] = Datetime.Utcnow(); newDocument["someFlag"] = "foo"; // change some more properties

基本上我有一个函数

public Task CustomerUpdate(string user, JObject jobject)
{
   ...
   JObject newDocument = JObject.FromObject(jobject);
   newDocument["lastUpdate"] = Datetime.Utcnow();
   newDocument["someFlag"] = "foo";
   // change some more properties in newDocument

   // call the database provider
   await this.dbProvider.ReplaceAsync(user, newDocument);
}
在我的单元测试中,我是这样嘲笑的:

dbProvider.Setup(p => p.ReplaceAsync(It.IsAny<string>(), It.IsAny<JObject>()))
                .Returns(Task.CompletedTask);
但我的单元测试无法访问CustomerUpdate函数中的局部变量。我想我也不能使用callback,因为dbprovider没有返回更新的对象

你知道我能做什么吗?

你可以用这个

JObject updatedDocument= null;
dbProvider.Setup(p => p.ReplaceAsync(It.IsAny<string>(), It.IsAny<JObject>()))
            .Returns(Task.CompletedTask)
            .Callback<string, JObject>((u, doc) => updatedDocument = doc);

在测试结束时添加此项,这将验证是否使用包含所需值的第二个参数调用它

dbProvider.Verify(p => p.ReplaceAsync(It.IsAny<string>(), It.Is<JObject>(j=>j["someFlag"] == "foo")));
dbProvider.Verify(p=>p.replaceAncy(It.IsAny(),It.Is(j=>j[“someFlag”]==“foo”));

在这里,我要建议大家小心随意使用
It.IsAny
。评论和答案中有一个讨论,OP认为这很有帮助。

如果解析不正确,您可以抛出异常。您可以返回
ReplaceAsync
的结果或它保存的对象,然后验证这一点。但也许你需要打破这个程序,这样你就可以分别测试每个阶段。
Assert.IsEquals("foo", updatedDocument["someFlag"])
dbProvider.Verify(p => p.ReplaceAsync(It.IsAny<string>(), It.Is<JObject>(j=>j["someFlag"] == "foo")));