我有这堂课:
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);
答案 0 :(得分:5)
您的设计真正说的是您的班级MyClass
没有依赖IFoo
,它依赖于从BaseFoo
和<派生的类实例/ strong>实施IFoo
。在这种情况下,最好引入一个统一的接口,然后将其用作依赖项并模拟:
interface IFooBar
{
bool BoolProp { get; set; }
void Method();
}
答案 1 :(得分:0)
如何声明从BaseFoo派生并实现IFoo的抽象类(BaseFooFoo?)。然后你可以向moq显示BaseFooFoo。