0

我在使用 moq 进行一些单元测试时遇到了一些麻烦。

如果我有这样的功能:

public string GetName(IMapinfoWrapper wrapper)
{
   return wrapper.Evaluate("My com command");
   ///"My comm command" is the same all the time.
}

然后我有一个测试来检查 GetName 函数的返回值:

[Test]
public void Test()
{
  Mock<IMapinfoWrapper> mock = new Mock<IMapinfoWrapper>();
  mock.Expect(mapinfo => mapinfo.Evaluate(It.IsAny<String>()))
      .Returns("TableName");

  Assert.AreEqual("TableName", GetName(mock.object));
}

所以我的问题是应该像这样定义模拟:

mock.Expect(mapinfo => mapinfo.Evaluate(It.IsAny<String>()))
    .Returns("TableName");

或像这样:

mock.Expect(mapinfo => mapinfo.Evaluate("My com command")
    .Returns("TableName");

使用第二种方式的唯一问题是,我觉得我将方法 GetName 的实现绑定为始终在内部使用“My com command”字符串。

这是我应该做的还是我做错了。
我才刚刚开始进行单元测试和模拟,所以我仍然不确定一切应该如何结合在一起。

4

1 回答 1

3

这取决于您实际测试的内容。

如果期望传递给 Evaluate 的任何字符串都将返回“TableName”,则使用对 IsAny 的调用。

否则,如果您期望给定特定输入的特定输出,例如传递“我的 com 命令”的情况,则传递第二个。

似乎您不是在寻找特定的输入,而是(在这种情况下)进行基本的健全性检查,所以我会说前者是正确的举动(在这种情况下也是如此,但如果您有更具体的情况它的用例)。

于 2009-01-30T05:56:00.050 回答