验证被调用的函数参数具有特定值

时间:2018-03-23 18:29:06

标签: 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 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没有返回更新的对象。

知道我该怎么办?

2 个答案:

答案 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"])