2016-07-22 2 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", _); 

Чтобы избежать этого, полезно избегать вызова обратно на подстанцию itute во время утверждения (например, Received) или конфигурации (например, Returns).

Смежные вопросы