[英]rhino mock an interface IA which implements interface IB with abstract class aB
我在界面中遇到的情况
public interface IA : IB
{
}
哪里
public interface IB
{
List<string> Errors{get;}
void AddError(string error);
}
与抽象类
public abstract class B
{
private List<string> errors = new List<string>();
public List<string> Errors{get{return errors;}}
public void AddError(string error)
{
if (!errors.Contains(error))
errors.Add(error);
}
}
我在另一个类上有一个方法:
public class MyClass
{
public void MyMethod(IA obj)
{
obj.AddError("some string");
}
}
然后我有一个单元测试,我想通过传递存根的IA来测试MyClass是否达到了预期的目的:
public void Test()
{
var sut = new MyClass();
var input = MockRepository.GenerateStub<IA>();
sut.MyMethod(input);
Assert.AreEqual(1, input.Errors.Count);
}
但是谈到断言时,由于IA的存根中不包含基类B,所以Errors为null,有什么方法可以指定我希望abtsract类提供IB的实现,而不必创建一个从B派生的具体类别?
我错过了其中的一些细节,但是我会继续扩展说,有一组接口(如IA都实现了IB),还有一组类(如MyClass)都采用了不同的接口,而MyMethod的细节取决于该接口它接受IA,但是与IB实施的相互作用始终是相同的。
一种可能的解决方案是创建IA的抽象实现
public abstract class A : B, IA
{
//abstract implementations of all properties and methods on IA, nothing concrete
}
然后可以将其存入单元测试中:
public void Test()
{
var sut = new MyClass();
var input = MockRepository.GenerateStub<A>();
sut.MyMethod(input);
Assert.AreEqual(1, input.Errors.Count);
}
然后就可以对A上的属性和方法进行存根(或嘲笑)。
这确实意味着要在IA静脉中存在的每个接口中编写额外的类nedds,虽然这远非理想,但是我现在才看到这是一种巧妙的方法。
接口代表行为契约。 从本质上讲,它没有任何实现。 您想要的是一个模拟对象,该对象具有由类B定义的行为(换句话说,您需要一个模拟的B对象),同时实现IA。
您可以使用多个部分模拟来实现它:
var sut = new MyClass();
var input = MockRepository.GeneratePartialMock<B, IA>();
sut.MyMethod((IA)input);
Assert.AreEqual(1, input.Errors.Count);
GeneratePartialMock是模拟已经定义了某些行为的类的方法。 基本上,它使您能够重写(存根)类中定义的可重写方法。 而且,如果您不存根方法,则将调用原始行为。
您可以在类型参数列表中包括更多接口(以您的情况为IA),以将行为动态添加到模拟对象。
请注意,您必须修改发布的代码才能使其正常工作:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.