2016-07-22 72 views
0

我有一個測試,其中NSubstitute檢查錯誤的電話在假類。當我按照以下代碼進行測試時,Received(...)方法會檢查值factory.featureClassName是否返回一次。Nsubstitute:收到檢查錯誤的方法

[Test] 
public void CreateDataController_WhenCalled_CreatesServiceSettings() 
{ 
    var factory = Substitute.ForPartsOf<AbstractDataServiceFactoryFake>("fileName"); 

    factory.CreateDataController(); 

    factory.Received(1).CreateServiceSettings("fileName", factory.FeatureClassName); 
} 

爲了測試(如預期的),該方法CreateServiceSettings(...)被調用一次我必須使用以下代碼:

[Test] 
public void CreateDataController_WhenCalled_CreatesServiceSettings() 
{ 
    var factory = Substitute.ForPartsOf<AbstractDataServiceFactoryFake>("fileName"); 
    var featureClassName = factory.FeatureClassName; 

    factory.CreateDataController(); 

    factory.Received(1).CreateServiceSettings("fileName", featureClassName); 
} 

看來,該Recieved()方法不直接連接到給定的方法通話結束後。任何人都可以解釋我,爲什麼會發生這種情況?

回答

0

這是NSubstitute語法的限制。

讓我們打破與第二個代碼示例會發生什麼:

factory 
    .Received(1) // ... check the next call has previously been received 
    .CreateServiceSettings("fileName", className) 
        // call is made to CreateServiceSettings, NSub checks 
        // it was received. 

在第一個代碼示例中,我們得到這個:

factory 
    .Received(1) // ... check the next call has previously been received 
    .CreateServiceSettings("fileName", factory.FeatureClassName) 
        // before CreateServiceSettings is invoked, its arguments 
        // must be evaluated. So factory.FeatureClassName 
        // is called next and NSubstitute checks that. 

換句話說,NSubstitute看到第二個代碼示例像這樣:

var _ = factory.Received(1).FeatureClassName; 
factory.CreateServiceSettings("fileName", _); 

爲了避免這種情況,避免回調到subst在斷言期間(如Received)或配置(如Returns)。