繁体   English   中英

犀牛模拟接口IA,该接口使用抽象类aB实现接口IB

[英]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),以将行为动态添加到模拟对象。

请注意,您必须修改发布的代码才能使其正常工作:

  1. Initialize()应该在接口IB中定义
  2. 方法应在B类中定义为虚拟

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM