Сообщения модульного тестирования - PullRequest
2 голосов
/ 08 июля 2010

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

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

Сейчас я делаю это:

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

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

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

Ответы [ 3 ]

2 голосов
/ 08 июля 2010

Если ваша задача - просто воспроизвести строки в ваших тестовых приборах, поместите их все в 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.");
}

Теперь ваша модель представления может выполнить свою логику и вернуть одно из StatusMessages:

public class SomeViewModel
{
    ...

    public string Status
    {
        get { return StatusMessage.SavedSuccessfully; }
    }

    ...
}

В вашем тесте:

Assert.AreEqual(StatusMessage.SavedSuccessfully, viewmodel.Status);
1 голос
/ 12 июля 2010

Я решил следующим образом:

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));
    }
}

Таким образом, я могу проверить, что мое сообщение "hi ric" должно соответствовать "hi {0}"

1 голос
/ 08 июля 2010

Я пойду с тем, что вы в настоящее время делаете, или, может быть, то, что предложил @Jay.

Но я действительно не понимаю, когда вы говорите,

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

Ожидаемая строка всегда HAS должна быть жестко закодирована для ее модульного тестирования. Вы никогда не должны использовать какие-либо вычисления в модульном тесте. Вы должны установить сценарий (дата, любые другие переменные), и тогда вы будете знать, какой будет ожидаемая строка. Вы тогда жестко закодируете это. Если вы хотите выполнить модульное тестирование одного и того же метода для разных строк, вы можете использовать атрибут TestCase в nunit или атрибут RowTest в MBUnit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...