模拟是运营商

Def*_*ult 2 c# generics unit-testing rhino-mocks

是否可以嘲笑is操作员?在我的代码中,我有逻辑取决于它是什么类型的类,但值本身作为公共接口存储在类中.

基本上,我想要做的就是回到true通过定义模拟是的IValue,但返回trueis Value

public class Value : IValue
{
}

public interface IValue
{
}
public class Tester
{
    public bool CheckIfValue(IValue value)
    {
        return value is Value;
    }
}

[Test]
public void TestIfValue()
{
    Tester tester = new Tester();

    var value = MockRepository.GenerateStub<IValue>();
    // can I add anything here which will make CheckIfValue return true?

    bool isValue = tester.CheckIfValue(value);
    Assert.That(isValue, Is.True);
}
Run Code Online (Sandbox Code Playgroud)

Tre*_*ley 6

不可以"模拟" is运算符,is在以下情况下仅返回true:

  1. 正在检查的对象是要检查的类型的实例.
  2. 正在检查的对象是要检查的类型的子类.
  3. 正在检查的对象实现了要检查的接口类型.

你的设计很糟糕,IValue如果你真的需要它作为一个实例,你不应该要求Value.

关键在于依赖于抽象而不是实现,这就是为什么你IValue要开始使用接口的原因.Tester不应该关心,如果它得到Value,MockValue或其他任何东西,它应该只依赖于所定义的方法和属性IValue界面.

创建模拟的关键是Tester在特定场景中测试类的行为,模拟允许您指定对象Tester为该测试接收的行为,而不必创建大量的虚拟类,例如class FakeValueWhichDoes... : IValue为了测试它.

  • 你的三个案例是不完整的.例如,`object o =(Func <string>)(()=>""); bool b = o是Func <object>;`结果为true,但不符合你的三种情况. (2认同)