我应该使用模拟测试方法实现吗?

时间:2009-01-30 05:48:06

标签: c# unit-testing mocking moq

使用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方法的实现与内部总是使用“我的com命令”字符串联系起来。

这是我应该做的,还是我做错了。我只是开始进行单元测试和嘲弄,所以我仍然不确定一切应该如何组合在一起。

1 个答案:

答案 0 :(得分:3)

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

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

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

看起来你不是在寻找具体的输入,而是(在这种情况下)进行基本的健全性检查,所以我会说前者是正确的举动(在这种情况下,你应该有更具体的案例)如果你有它的用例)。