我有這個工廠類,我想正確地測試它。假設我有一個抽象類,它有很多孩子(繼承)。模擬靜態方法Activator.CreateInstance返回另一個類的模擬
正如你可以在我的Factory類中看到的方法BuildChild,我希望能夠在運行時創建一個子類的實例。我必須能夠在運行期間創建此實例,因爲在運行時不會知道類型。而且,我不能在這個項目中使用Unity(如果是這樣,我不會問如何實現這一點)。
下面是我想測試我的工廠類:
public class Factory
{
public AnAbstractClass BuildChild(Type childType, object parameter)
{
AnAbstractClass child = (AnAbstractClass) Activator.CreateInstance(childType);
child.Initialize(parameter);
return child;
}
}
爲了測試這一點,我想找到一種方法來模擬Activator.CreateInstance返回一個子類的我自己的嘲笑對象。我怎樣才能做到這一點?或者,如果你沒有使用Activator.CreateInstance(和Unity)有更好的方法來做到這一點,如果它更容易測試和模擬,我可以開放它!
我目前使用Moq來創建我的模擬,但由於Activator.CreateInstance是一個靜態類的靜態方法,我不知道如何做到這一點(我已經知道,Moq只能創建模擬實例對象)。我看了一下微軟的Fakes,但沒有成功(我在理解它的工作原理和找到一些很好解釋的例子時遇到了一些困難)。
請幫幫我!
編輯:
我需要模擬Activator.CreateInstance,因爲我想迫使該方法返回另一個嘲笑的對象。我想要的正確的東西只是存根這種方法(而不是嘲笑它)。
所以當我測試BuildChild這樣的:
[TestMethod]
public void TestBuildChild()
{
var mockChildClass = new Mock(AChildClass);
// TODO: Stub/Mock Activator.CreateInstance to return mockChildClass when called with "type" and "parameter" as follow.
var type = typeof(AChildClass);
var parameter = "A parameter";
var child = this._factory.BuildChild(type, parameters);
}
Activator.CreateInstance調用類型和參數將返回,而不是創建真正的子類的新實例,我的嘲笑對象(尚未實施)。
當你說這應該是值得信賴的,所以我不需要嘲笑它,你是完全正確的。我只是編輯我的帖子,解釋爲什麼我需要嘲笑這個類。 – Jeep87c
@ Jeep87c這就是爲什麼我也給瞭解決方法。除非你想進入更強大的框架......但是那些促進糟糕的OO行爲 –
哦,對不起,你可能在編輯我的文章時編輯了你的文章。沒關係,並感謝您的解決方法。由於你所說的原因,我不想使用更強大的框架。 – Jeep87c