2

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

基本上,我想做的是true通过将模拟定义为 of 来返回,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);
}
4

1 回答 1

6

不,不可能“模拟”is操作员,is在以下情况下只会返回 true:

  1. 被检查的对象是被检查类型的一个实例。
  2. 被检查的对象是被检查类型的子类。
  3. 被检查的对象实现被检查的接口类型。

您的设计很糟糕,IValue如果您确实需要它作为Value.

关键是依赖于抽象而不是实现,这就是为什么你有IValue接口开始的原因。Tester不应该关心它是否得到 a或其他任何东西ValueMockValue它应该只取决于IValue接口中定义的方法和属性。

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

于 2013-04-15T13:21:41.763 回答