C# 模拟is操作员

C# 模拟is操作员,c#,unit-testing,generics,rhino-mocks,C#,Unit Testing,Generics,Rhino Mocks,是否可以模拟Is运算符?在我的代码中,根据类的类型我有逻辑,但是值本身作为公共接口存储在类中 基本上,我想做的是通过将mock定义为IValue来返回true,但是的返回true是值 public class Value : IValue { } public interface IValue { } public class Tester { public bool CheckIfValue(IValue value) { return value is Va

是否可以模拟
Is
运算符?在我的代码中,根据类的类型我有逻辑,但是值本身作为公共接口存储在类中

基本上,我想做的是通过将mock定义为
IValue
来返回
true
,但是
的返回
true
是值

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);
}
公共类值:IValue
{
}
公共接口IValue
{
}
公共类测试员
{
公共布尔校验值(IValue值)
{
返回值是值;
}
}
[测试]
public void TestIfValue()
{
测试仪=新测试仪();
var value=MockRepository.GenerateStub();
//我可以在这里添加任何可以使CheckIfValue返回true的内容吗?
bool isValue=测试仪。CheckIfValue(值);
Assert.That(isValue,Is.True);
}
否无法“模拟”
is
运算符,
is
仅在以下情况下返回true:

  • 要检查的对象是要检查的类型的实例
  • 要检查的对象是要检查的类型的子类
  • 要检查的对象实现要检查的接口类型
  • 你的设计很糟糕,如果你真的需要它成为
    值的实例,你不应该要求任何
    IValue

    关键是依赖于抽象而不是实现,这就是为什么要从
    IValue
    接口开始
    Tester
    不应该关心它是否获得
    值、
    MockValue
    或其他任何东西,它应该只依赖于
    IValue
    接口中定义的方法和属性


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

    确实
    MockRepository.GenerateStub()
    返回一个
    IValue
    实现,该实现不是
    Value
    ?@ken2k-是的,它将在运行时创建一个类,使用Castle.DynamicProxy框架实现该接口。+1,同意错误的设计。接口的全部目的是不使用实际实现。如果参数类型为IValue,则整个代码块应仅使用IValue公开的内容。您的三个案例仅供参考。例如,
    objecto=(Func)(()=>“”);布尔b=o是函数结果为真,但不符合您的三种情况中的任何一种。@EricLippert谢谢您指出,我忘了提到协方差。如果您有
    int怎么办?”?x=123;布尔b=x为整数整数?不是int,不是int的子类型,没有检查接口,也没有涉及协方差,但b仍然为真。你错过了第五个案子。