Как выполнить модульное тестирование, чтобы регистратор вызывался с правильной локализуемой отформатированной строкой? - PullRequest
3 голосов
/ 21 марта 2011

В тестируемом приложении я хочу убедиться, что для определенных входов вызывается регистратор. Некоторые из методов имеют разные возможные сообщения регистратора (например, «значение искажено», «значение выходит за пределы диапазона»). Таким образом, я хочу убедиться, что регистратор вызывается с правильным сообщением.

Строки регистратора сами по себе находятся в RESX и могут быть локализованы в будущем. Кроме того, формулировка может измениться. Поэтому простое сравнение с жестко запрограммированной строкой может привести к нарушению связанных тестов при каждом изменении текста. Так как они локализуемы, это означало бы, что мне пришлось бы принудительно выполнить юнит-тест под определенной культурой, или есть лучший способ?

Сложность этого заключается в том, что строки RESX на самом деле не так просты, как указано выше, но имеют вид "Line {0}: Value '{1}' at column {2} is malformed.". Затем они используются в качестве входных данных для string.Format (), например, для получения "Line 12: Value '12a.45' at column 45 is malformed.". Это строка, которую затем получает регистратор. Стоит ли жестко закодировать эту строку в модульный тест?

Edit:

Я попытаюсь объяснить более подробно, с сильно упрощенным методом, чтобы показать, что я имею в виду:

public void ConvertSomething(object value)
{
    if (/* Check if valid value */)
    {
        var convertedValue = /* Some conversion */ ;
        if (/* Check is in range */)
        {
            // Do something
        }
        else
        {
            Logger.Log(string.Format(Resources.OutOfRange, LineNumber, convertedValue));
        }
    }
    else
    {
        Logger.Log(string.Format(Resources.InvalidValue, LineNumber, value, ColumnNumber));
    }
}

Как проверить, что регистратор вызывается с правильным сообщением? Я не могу просто проверить, был ли сделан какой-либо вызов регистратору. Если я даю ему допустимое, но вне допустимого значения, но проверка достоверности содержит ошибку, он вызовет регистратор, но с сообщением «недопустимое значение», когда на самом деле должно быть «вне диапазона».

Я могу издеваться над регистратором, чтобы видеть, как он вызывался и каковы были параметры. Но что я должен утверждать против?

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Вы можете изменить текущую культуру потоков в коде, если культура существует на компьютере.Если он не существует, вам нужно установить / создать его.

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

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

NUnit поддерживает изменение культуры тестовых наборов:

http://www.nunit.org/index.php?p=culture&r=2.4.8

Обновление: Я вижу, поэтому проблема в том, что тест не может заглянуть в регистратор?Я хотел бы предложить, чтобы вы могли либо издеваться над регистратором, который знает, что он тестируется и содержит свои собственные утверждения, либо отказаться от тестирования самого регистратора и проверки того, что спутниковые сборки загружаются в настоящее время при изменении культуры.Если регистратор просто использует файл ресурсов, тогда среда выполнения .NET будет обрабатывать загрузку правильного файла или файла по умолчанию для базового файла культуры.

Затем можно провести отдельные тесты, чтобы показать, что регистратор регистрирует, не беспокоясьо том, что он записывает, как это описано в другом тесте.

Обновление 2: Мне кажется, я вижу, что вы пытаетесь сделать.Возможно ли вообще, чтобы регистратор принял формат строки и params object[] args, чтобы получить доступ к строке до того, как она будет вставлена ​​с определенными значениями?

В качестве альтернативы, возможно ли сделать строкустатический или это от природы меняет каждый тестовый прогон?Для теста допустимо иметь жестко запрограммированные значения, если сам тест в первую очередь отвечает за заполнение значений.Кроме того, что касается культуры, я бы обратил эти изменения отдельно к изменениям, внесенным различными путями кода, выбирая разные сообщения.

Обновление 3: извините, я не мог видеть дрова длядеревья.Сам тест может построить ожидаемую строку из файла resx, который использует код, и просто вставить жестко закодированные значения.Это зависит от результатов теста, не отличающихся от каждого запуска.

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

0 голосов
/ 21 марта 2011

Вы создаете фальшивый логгер и следите за тем, чтобы ваш код вызывал его при необходимости.

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