嘲笑受保护的成员而不进行反思

Mocking a protected member without reflection

我有一个 return 是资源文件中的字符串的成员,我想对此进行单元测试,因为有很多,而且它们可能会被错误地更改。我知道这可以使用反射来实现,但我被要求以不使用反射的方式来实现。

成员长这样;

protected override string StringOne
    {
        get
        {
            return Resources.String;
        }
    }

我知道为成员设置 return 可以这样完成;

 mock.Protected()
            .Setup<string>("StringOne")
            .Returns("Returned string.");

and .verifiable() 可以添加到这个末尾。但是我找不到如何验证字符串是否被 returned。或者我是否认为通过使用 .verifiable() 进行设置,.returns("") 值是预期的,并调用

mock.Verify();

将验证成员是否 return 编辑了正确的字符串,或者只是验证成员在测试期间的某个时刻被调用?

您在这里遇到的问题是您正在尝试测试 class 之外无法获得的内容。测试应该只测试 class 的 public 接口,这样只要 public 的行为保持不变,class 的内部就可以改变。

在这种情况下,我认为您有两个选择:

一个是将此代码移动到另一个 class 中,这些属性为 public,这样您的测试就可以调用新的 public 属性并检查 return 和需要使用 属性 值的 classes 可以调用你的新 class。无论如何,继承通常不是共享代码的好方法(博客 post 解释了这个概念:http://www.blinkingcaret.com/2016/04/13/composition-superior-inheritance/

另一个是测试这些属性最终被用在什么地方。例如,如果你有一些方法将 StringOne 的值传递给另一个模拟的 class,你可以检查是否传递了正确的值,或者它是否最终被用于文件路径,你应该测试文件路径最终是否正确等