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")));