[英]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.