Сообщения модульного тестирования


У меня есть веб-страница, которая показывает различные сообщения в соответствии с различными условиями. Я хочу провести модульный тест, поэтому я настроил свой проект на использование MVVM, и я тестирую свою ViewModel.

Мой ViewModel теперь форматирует разные сообщения. Как я могу это проверить? Я не хочу воспроизводить все строки, это кажется грязным...

Теперь я делаю вот что:

void test() 
{
    string message = _viewModel.DoWork();
    Assert.AreEqual(message, Resource.MyResourceText);
}

Но это простой случай. Теперь у меня есть динамические строки, содержащие системную дату и другие переменные.

Как я могу это проверить в элегантном смысле? Спасибо!

3 2

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}"