【发布时间】:2011-12-20 09:55:43
【问题描述】:
我有这门课:
public class BaseFoo
{
public bool BoolProp { get; set; }
}
public interface IFoo {
void Method();
}
public class FooClass : BaseFoo, IFoo
{
public void Method()
{
// DoSomething
}
}
public class MyClass
{
IFoo foo; //
public MyClass(IFoo foo)
{
this.foo = foo;
}
public void DoSomething()
{
if (((FooClass)foo).BoolProp)
{
// yeah
}
else
{
//bad
}
}
}
我的情况是:
void main()
{
MyClass obj = new MyClass(new FooClass());
obj.DoSomething();
}
我想为 IFoo 接口创建一个模拟对象,它也允许我模拟 BaseFoo 类,因为我需要始终避免运行“if (((FooClass)foo).BoolProp 的“else”分支)”在 MyClass.DoSomething() 方法中。
那么,如何创建一个模拟对象来模拟 MyClass 中使用的 BaseFoo.BoolProp 的行为(它将采用 IFoo 的模拟对象)?
我这样做没有任何结果,因为“BoolProp”不是虚拟的,我无法更改它,因为它是 .NET Framework 类的一部分:
var cMock = new Mock<BaseFoo>();
var iMock = cMock.As<IFoo>();
cMock.Setup(c => c.BaseProp).Returns(true);
MyClass myClass = new MyClass(iMock.Object);
【问题讨论】:
-
很高兴这不起作用 - 这是您的类设计中的代码异味:您不应该将类型为
IFoo的依赖项转换为BaseFoo。您违反了 Liskov 替换原则,并且以我能想到的任何方式执行此操作都是错误的选择。 -
我很想在这个问题上选择-1...
标签: c# unit-testing mocking nunit