Использование переменных в модульных тестах - значение, установленное в TestA, сбрасывается на значение по умолчанию в TestB - PullRequest
0 голосов
/ 27 января 2010

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

В моем тестовом классе у меня есть куча переменных-членов, которые содержат данные, которые я отправляюв мои объекты, которые затем создаются в хранилище.

Одним из первых тестов является создание записи в хранилище на основе данных в переменных-членах.Затем я извлекаю UniqueIdentifier из хранилища данных и устанавливаю для него одну из переменных-членов.

В одном из последующих тестов я хочу использовать UniqueIndentifier для извлечения записи из хранилища данных, но значение равно нулюкак если бы значение не было установлено!

Кстати, я использую MSTest (по умолчанию Visual Studio One).

Если у кого-то есть какие-либо предложения, я бы очень признателен.

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Ваши тесты должны быть небольшими, независимыми и быстрыми. Теоретически модульные тесты могут выполняться в любом порядке, индивидуально или в виде пакета тестов, и они не должны полагаться на какие-либо значения конфигурации (например, строку подключения).

Звучит так, как будто вы пытаетесь сохранить физическое хранилище данных, а затем проверить, что значение действительно существует в более позднем тесте. Итак, вы написали тест, который зависит от предыдущего теста. Это слишком хрупкая установка.

РЕДАКТИРОВАТЬ 1

Я не проверяю свои репозитории. Я использую NHibby, и я знаю, что это работает, пока моя конфигурация действительна. И если моя конфигурация неверна, я бы не использовал модульный тест для проверки этого.

Я пишу приложения MVC или WPF / M-V-VM. С этими стилями очень легко писать тесты на уровне контроллера или модели. Я буду издеваться над моими репозиториями таким же образом, как этот

[TestMethod]
public void TestThatSomethingHappens()
{
    var repo = new Mock<IRepository>();
    repo.Setup(x => x.Find<Customer>(It.IsAny<int>())).Returns(_somePredefinedCustomer);
    // etc.
}

Итак, когда мой код извлекает значение из репозитория, он извлекает заранее определенного клиента, и этот клиент уже встроен в метод настройки теста (или конструктор, если вы используете xUnit). Если я захочу проверить, что происходит, когда покупатель не найден, это будет другой тест, у меня будет .Returns(null), и я посмотрю, что делает мой контроллер или WinForm.

1 голос
/ 27 января 2010

Похоже, вы проводите интеграционный тест. Как упоминал Джаретт, ваши тесты - это очень хрупкая ситуация, так как они зависят от состояния предыдущего теста. Если вам нужно настроить какое-то состояние для тестов, посмотрите на использование атрибута TestInitialize и атрибута TestCleanup. Эти методы будут вызываться при каждом запуске теста. Если вам нужно настроить состояние для всей тестовой группы, вы можете использовать ClassInitialize и ClassCleanup Однако это не рекомендуется, поскольку я не верю, что порядок гарантирован при выполнении MSTests.

Собираем все вместе

[ClassInitialize]
public void ClassInitialize()
{
//Do something to create the data store, create files, setup DB, etc..
}
[ClassCleanup]
public void ClassCleanup()
{
//Tear down the resources
}

[TestInitialize]
public void TestInitialize()
{
//inject some data for the test from the resource created in ClassInitialize()
}

[TestCleanup]
public void TestCleanup()
{
//Clean up any data or values you injected into your datastore from TestInitialize()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...