2016-07-22 18 views
0

Ich habe einen Test, wo NSsubstitute den falschen Anruf bei einer gefälschten Klasse überprüft. Wenn ich den Test wie den folgenden Code mache, überprüft die Received(...) Methode, dass der Wert factory.featureClassName einmal zurückgegeben wird.Nsubstitute: Empfangene Überprüfungen falsche Methode

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

    factory.CreateDataController(); 

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

Um zu testen (wie beabsichtigten), dass die Methode CreateServiceSettings(...) aufgerufen wird, sobald ich den folgenden Code verwenden:

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

    factory.CreateDataController(); 

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

Es scheint, dass die Recieved() Methode nicht direkt mit dem angegebenen Verfahren verbunden ist, nach dem Anruf. Kann mir jemand erklären, warum das passiert?

Antwort

0

Dies ist eine Einschränkung der NSubstitute-Syntax.

Lasst uns brechen, was mit dem zweiten Codebeispiel passiert:

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

Im ersten Codebeispiel, bekommen wir diese statt:

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. 

Mit anderen Worten sieht NSubstitute die zweite Codebeispiel wie folgt:

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

Um dies zu vermeiden, ist es sinnvoll, den Rückruf in einen Subst zu vermeiden itute während einer Assertion (wie Received) oder Konfiguration (wie Returns).