如何在Moq中模拟字符串类

时间:2014-03-07 18:01:46

标签: c# unit-testing nunit moq

我有一个类似这样的测试方法

[Test]
public void VerifyRedirectedTempCodeWithAnEmptyString()
{
    var mockStringLength = new Mock<string>();
    mockStringLength.Setup(x => x.Length).Returns(0);
    Boolean returnValue = VerifyRedirectedTempCode(mockStringLength.Object);
    Assert.AreEqual(returnValue, false);
}

没有编译错误,但是当我运行此测试时它给出了 System.NotSupportedException:类型为mock必须是接口或抽象或非密封类。这是我的实际方法

    public virtual Boolean VerifyRedirectedTempCode(string tempAuthCode)
    {
        if (tempAuthCode != null && tempAuthCode.Length > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

那么,如何模拟string.length属性。所以即使将来如果他们更新长度方法它也不应该影响我的测试方法。如何模拟?

1 个答案:

答案 0 :(得分:1)

您不需要在此处模拟字符串长度。您正在测试的方法需要一个整数,所以只需传递一个整数!如果你真的想要,你可以传递它string.Empty.Length,以防万一在框架的未来版本中发生变化。

使用单元测试,您将根据其输入及其依赖项的状态测试方法的行为。如果您的方法需要int并返回bool,那么您需要做的就是传入int。该方法不应该关心它来自何处。这是一个关注点分离的问题。


在您的更新之后,假设您的方法需要string,您只需要在给定不同字符串输入的情况下测试其行为。至少nullstring.Empty和一些有效string

当您更改方法的实现时,您不能指望您的测试永远不会失败。实际上,您应该首先更改测试,以便它失败,更改代码以便测试通过,然后重构。这称为红色,绿色,重构循环。


似乎您的验证器可能是更大工作的一部分,也许您真正感兴趣的是测试其余代码在不同的潜在验证结果下的行为。在这种情况下,我建议您将验证逻辑提取到一个单独的类中,然后可以模拟其接口。提供验证器作为对需要它的代码的依赖。然后,在测试中,您可以提供以预定方式运行的模拟验证器。这样你就可以编写你的测试而不用担心将来对验证器逻辑的更改会破坏它们。这似乎是你问题的本质。