基本上我有一个功能
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);
我需要验证作为参数传递给newProocument的dbProvider.ReplaceAsync方法是否具有正确的属性值。
理想情况下,我想从我的单元测试中做到这一点:
Assert.IsEquals("foo", newDocument["someFlag"])
但我的单元测试无法访问CustomerUpdate函数中的局部变量。而且我认为我不能使用回调,因为dbprovider没有返回更新的对象。
知道我该怎么办?
答案 0 :(得分:1)
在测试结束时添加它,这将验证是否使用包含您想要的值的第二个参数调用它...
dbProvider.Verify(p => p.ReplaceAsync(It.IsAny<string>(), It.Is<JObject>(j=>j["someFlag"] == "foo")));
虽然我在这里,但我会建议谨慎使用It.IsAny
。在this question的评论和答案中进行了讨论,OP发现了这些评论和答案。
答案 1 :(得分:0)
您可以使用Callbacks。
JObject updatedDocument= null;
dbProvider.Setup(p => p.ReplaceAsync(It.IsAny<string>(), It.IsAny<JObject>()))
.Returns(Task.CompletedTask)
.Callback<string, JObject>((u, doc) => updatedDocument = doc);
然后使用updatedDocument
进行断言。
Assert.IsEquals("foo", updatedDocument["someFlag"])