Сообщения модульного тестирования
У меня есть веб-страница, которая показывает различные сообщения в соответствии с различными условиями. Я хочу провести модульный тест, поэтому я настроил свой проект на использование MVVM, и я тестирую свою ViewModel.
Мой ViewModel теперь форматирует разные сообщения. Как я могу это проверить? Я не хочу воспроизводить все строки, это кажется грязным...
Теперь я делаю вот что:
void test()
{
string message = _viewModel.DoWork();
Assert.AreEqual(message, Resource.MyResourceText);
}
Но это простой случай. Теперь у меня есть динамические строки, содержащие системную дату и другие переменные.
Как я могу это проверить в элегантном смысле? Спасибо!
3 ответа:
Если вы просто воспроизводите строки в тестовых приспособлениях, поместите их все в
enum
илиclass
.public static class StatusMessage { public static readonly string SavedSuccessfully = "Item was successfully saved."; public static readonly string DuplicateRecord = "This record is a duplicate."; public static readonly string SubscriptionExpired = "Your subscription has expired; please renew now."); }
Теперь ваша viewmodel может выполнить свою логику и вернуть один из StatusMessages:
public class SomeViewModel { ... public string Status { get { return StatusMessage.SavedSuccessfully; } } ... }
В вашем тесте:
Assert.AreEqual(StatusMessage.SavedSuccessfully, viewmodel.Status);
Я пойду с тем, что вы сейчас делаете или, возможно, то, что предложил @Jay.
Но я действительно не понимаю, когда ты говоришь:
Теперь у меня есть динамические строки, содержащие системная дата и другие переменные.
Ожидаемая строка всегдаимеет быть жестко закодирована для того, чтобы модульно проверить ее. Вы никогда не должны использовать какие-либо вычисления в модульном тесте. Вы должны установить сценарий (дату, любые другие vars), а затем вы знаете, что ваша ожидаемая строка будет. Вы затем задает его. Если вы хотите провести модульный тест одного и того же метода для разных строк, вы можете использовать атрибут
TestCase
в nunit или атрибутRowTest
в MBUnit.
Я решил так:
class MyTestClass { void test() { string message = _viewModel.DoWork(); MyAssert.StringFormatConforms(message, Resource.MyResourceText); } } class MyAssert { public static void StringFormatConforms(string stringToCheck, string format) { // replace {0}, {1} with .* string regex = "^" + Regex.Replace(format, "{[0-9]+}", ".*") + "$"; bool conforms = Regex.IsMatch(stringToCheck, regex); if (!conforms) throw new AssertFailedException(String.Format("The string {0} does not conforms to format: {1}", stringToCheck, format)); } }
таким образом, я могу проверить, что мое сообщение "Привет Рик" должно соответствовать "привет {0}"