C# 如何模拟扩展类并实现接口的对象?
我有这门课:C# 如何模拟扩展类并实现接口的对象?,c#,unit-testing,mocking,nunit,C#,Unit Testing,Mocking,Nunit,我有这门课: 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 { IF
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接口创建一个mock对象,它也允许我模拟BaseFoo类,因为我需要始终避免在MyClass.DoSomething()方法中运行“if(((FooClass)foo.BoolProp)”的“else”分支。那么,如何创建一个mock对象来模拟MyClass中使用的BaseFoo.BoolProp的行为(它将采用IFoo的mock对象)
我这样做没有任何结果,因为“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);
var cMock=new Mock();
var iMock=cMock.As();
Setup(c=>c.BaseProp).返回(true);
MyClass MyClass=新的MyClass(iMock.Object);
如何声明一个从BaseFoo派生并实现IFoo的抽象类(basefooo?)。然后,您可以向moq显示BaseFooo。您的设计真正的意思是,您的类MyClass
不依赖于IFoo
,它依赖于派生自BaseFoo
和IFoo
的类实例。在这种情况下,最好引入一个统一接口,然后将其用作依赖项和模拟:
interface IFooBar
{
bool BoolProp { get; set; }
void Method();
}
很高兴这不起作用-这是类设计中的代码味道:您不应该将类型
IFoo
的依赖项强制转换为BaseFoo
。你违反了Liskov替换原则,无论我怎么想,这都是一个糟糕的选择。我很想在这个问题上得到-1。。。