我有被打開兩個WCF服務的Windows服務。我想單元測試OnStart()並聲明service1.Open()和service2.Open()被調用。的OnStart()看起來是這樣的:如何確認打開()被調用我的ServiceHost在我的單元測試
protected override void OnStart(string[] args)
{
// host WCF services
_service1.Open();
_service2.Open();
}
我注射服務的構造函數重載這樣:
public WinService(ServiceHostBase service1,
ServiceHostBase service2)
{
_service1 = service1;
_service2 = service2;
InitializeComponent();
}
我使用RhinoMocks產生ServiceHostBase的存根這樣的:
[TestMethod()]
public void WinServiceOnStartCallsDependenciesAsExpected()
{
ServiceHostBase service1 = MockRepository.GenerateStub<ServiceHostBase>();
ServiceHostBase service2 = MockRepository.GenerateStub<ServiceHostBase>();
WinService target = new WinService(service1, service2);
WinService_Accessor privateTarget = new WinService_Accessor(new PrivateObject(target));
privateTarget.OnStart(null);
當我的測試呼叫的OnStart(),我得到一個空引用異常時,它調用service1.Open()。我已經確認service1是一個模擬對象,並且它是Open(),它拋出了null。我知道Open()實際上是System.ServiceModel.Channels.CommunicationObject上的一個方法,我嘗試了Stubbing或Mocking,但我仍然得到對象ref錯誤。這不是一個虛擬的方法,所以我認爲它只是不被嘲笑的版本覆蓋,但是當我試圖建立一個預期reportservice.Stub(r => r.Open())
,我得到一個不同的異常大約有不是一個默認的超時時間,因爲如果它運行的實際CommunicationObject Open()方法,而不是引發null參考的RhinoMocky。
這一切說,我只是尋求幫助,如何確認打開()被調用我在單元測試的ServiceHost。 =]
是啊,我是辯論的包裝方法,但我認爲,我們只是將不得不離開它發現。 Open()調用永遠不會是有條件的,所以風險似乎不會讓額外的複雜性值得。如果沒有驚人的驚喜出現,我會將其標記爲答案。 – sonicblis