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仍然为真。你错过了第五个案子。