2013-06-25 48 views
5

我想獲得一個被注入到構造函數中的模擬(通過Nsubstitute)類。Autofixture + NSubstitute:凍結模擬?

我用下面的代碼

var fixture = new Fixture() 
    .Customize(new AutoNSubstituteCustomization()); 

var sut = fixture.Create<MyService>(); 

是成功創建的SUT和接口的嘲笑版本,稱爲「IFileUtils」注入的「則將MyService」的構造。

,但我需要訪問它,所以讀我相信以後我需要凍結的對象,所以我有機會獲得它像這樣

var fileUtilMock= fixture.Freeze<Mock<IFileUtils>>(); 

但這種代碼,我相信這是一個起訂量語法爲「模擬」無法找到。

通常建立你做一個類的Nsubstitute以下

var fileUtilMock= Substitute.For<IFileUtils>(); 

,但當然這不是凍結所以它不是用來和注入的構造。

任何人都可以幫忙嗎?

回答

10

this Mocking tools comparison article by Richard Banks和AutoMoq是如何工作的,我相信:

  • NSubstitute沒有MockMock.Object喜歡起訂量確實
  • 一個AutoFixture.Auto *擴展鉤之間的分離在SpecimenBuilderNode中提供[mocked]接口的實現,即fixture.Create<IFileUtils>()應該工作
  • 凍結相當於var result = fixture.Create<IFileUtils>(); fixture.Inject(result)

因此,你應該只能夠說:

var fileUtilMock = fixture.Freeze<IFileUtils>(); 
+0

@daniel hilgarth是我推論的任何好東西:D隨意編輯儘可能多的,你喜歡和/或告訴我刪除帖子! –

6

你必須凍結創建MyService實例之前的自動模擬實例。

更新

由於魯本Bartelink指出,隨着NSubstitute所有你需要做的是:

var fixture = new Fixture() 
    .Customize(new AutoNSubstituteCustomization()); 

var substitute = fixture.Freeze<IFileUtils>(); 

..和再使用NSubstitute的擴展方法。

這樣,凍結的實例將被提供給MyService構造函數。

對於接口IInterface

public interface IInterface 
{ 
    object MakeIt(object obj); 
} 

所有您有做的是:

var substitute = fixture.Freeze<IInterface>(); 
substitute.MakeIt(dummy).Returns(null); 

Returns實際上是NSubstitute擴展方法。基於推論

+0

但是這個我相信是起訂量,我使用NSubstitute,以及素 - 找不到或存在模擬.. – Martin

+0

你是對的。我剛剛更新了答案。 –

相關問題