2016-08-11 1 views
0

Я использую для своих тестов NUnit и попытаюсь проверить, вызван ли метод с правильными значениями. Пока не все будет хорошо. Я должен локализовать тексты и поэтому использовать для этого строки ресурсов. Каждый модульный тест теперь терпит неудачу, что тесты для метода, который нужно получить, где параметр string содержит новую строку.NSubstitute: Received() не проверяет строковый параметр, когда строка поступает из ресурса

Вот упрощенный пример:

// Old Version, where the unit test succeed 
public void CallWithText(ICallable callable) 
{ 
    callable.ShowText("Some text with a new\nline."); 
} 

// New Version, where the unit test fails 
// Text of `Properties.Resources.TextWithNewLine` in the 
// Resources.resx is "Some text with a new 
// line." 
public void CallWithText(ICallable callable) 
{ 
    callable.ShowText(Properties.Resources.TextWithNewLine); 
} 

[Test] 
public void CallWithText_WhenCalled_CallsCallable() 
{ 
    var caller = new Caller(); 
    var callable = Substitute.For<ICallable>(); 

    caller.CallWithText(callable); 

    callable.Received(1).ShowText("Some text with a new\nline."); 
} 

Это кажется мне, что есть проблема с новой строки. Есть ли у кого-нибудь решение, потому что это беспорядок, чтобы адаптировать все модульные тесты.

+0

Пожалуйста, отправьте сообщение [mcve]. Также опубликуйте результат теста, который терпит неудачу. Вы уверены, что файл ресурсов содержит только одну новую строку, а не строку? –

+0

Вы были правы (например, @Alexandr Niktin), файл ресурсов, содержащий \ r \ n, и это причина, по которой тест не прошел. – scher

ответ

1

проблема не связана с NSubstitute но String себе. Новый символ линии не только \n. Это специфическая среда: \r\n на Windows, \n на Unix, \r на ранних Mac OS. Используйте Shift + Введите, чтобы добавить новые строки правильно в диспетчере ресурсов.

У вас есть несколько способов использования:

  1. Environment.NewLine свойство, которое знает новый символ строки для текущей среды:

    callable.Received(1).ShowText("Some text with a new" + Environment.NewLine + "line."); 
    
  2. Используйте явную новую строку в вашем ожидается строка:

    callable.Received(1).ShowText(@"Some text with a new 
    line."); 
    
1

Сравнивая точные строки в модульном тесте, добавьте больше поддерживающей работы.
В вашем случае new line могут отличаться в разных условиях исполнения.

Для строк я предлагаю утверждать пройденный параметр с помощью метода Contains. Где можно проверить на более важные слова

[Test] 
public void CallWithText_WhenCalled_CallsCallable() 
{ 
    var caller = new Caller(); 
    var callable = Substitute.For<ICallable>(); 

    caller.CallWithText(callable); 

    callable.Received(1).ShowText(Arg.Is<string>(text => text.Contains("Some text"))); 
} 
1

Это указывает на Properties.Resources.TextWithNewLine и "Some text with a new\nline." и разные. Не зная, слишком много о Properties.Resources.TextWithNewLine, я предлагаю вам попробовать изменить тест

[Test] 
public void CallWithText_WhenCalled_CallsCallable() 
{ 
    var caller = new Caller(); 
    var callable = Substitute.For<ICallable>(); 

    caller.CallWithText(callable); 

    callable.Received(1).ShowText(Arg.Any<string>()); 
} 

Или использовать фактическую строку, если вы действительно хотите, чтобы утверждать содержимое строки, изменения (убедитесь, что ресурсы файл находится в тестовый проект)

[Test] 
public void CallWithText_WhenCalled_CallsCallable() 
{ 
    var caller = new Caller(); 
    var callable = Substitute.For<ICallable>(); 

    caller.CallWithText(callable); 

    callable.Received(1).ShowText(Properties.Resources.TextWithNewLine); 
} 
+0

Thanx для вашего ответа. Как упрощается пример, значение параметра в исходном примере является составным. С тестом я также хочу проверить, правильно ли вычисляется значение параметра. Поэтому оба ваших успеха не работают в моем случае. – scher

+0

@scher можете ли вы предоставить больше информации в OP, чтобы отразить это? –

+0

Спасибо за вашу работу, извините за мой недостаток, объяснив вопрос подробно. – scher

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