【问题标题】:Verify function parameters being called have a specific value验证被调用的函数参数是否具有特定值
【发布时间】:2018-06-06 20:27:20
【问题描述】:

基本上我有一个功能

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

我需要验证作为参数传递给 dbProvider.ReplaceAsync 方法的 newDocument 是否具有正确的属性值。

理想情况下,我想从我的单元测试中做到这一点:

Assert.IsEquals("foo", newDocument["someFlag"])

但我的单元测试无法访问 CustomerUpdate 函数中的局部变量。而且我认为我也不能使用回调,因为 dbprovider 没有返回更新的对象。

知道我能做什么吗?

【问题讨论】:

  • 如果解析不正确,可以抛出异常。您可以返回 ReplaceAsync 的结果或它保存的对象,然后验证。但也许你需要打破这个过程,这样你就可以分别测试每个阶段。

标签: c# unit-testing testing moq


【解决方案1】:

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

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

虽然我在这里,但我建议谨慎使用 It.IsAny。 cmets 中有一个讨论和this question 上的答案,OP 认为这很有帮助。

【讨论】:

    【解决方案2】:

    您可以为此使用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"])
    

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2016-10-18
      • 2010-12-02
      • 2015-12-11
      相关资源
      最近更新 更多