簡體   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