Могу ли я использовать NUnit TestCase для тестирования ложного хранилища и реального хранилища - PullRequest
2 голосов
/ 17 марта 2011

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

    private readonly StandardKernel _kernel = new StandardKernel();
    private readonly IPersonRepository fakePersonRepository;
    private readonly IPersonRepository realPersonRepository;
    [Inject]
    public PersonRepositoryTests()
    {

        realPersonRepository = _kernel.Get<IPersonRepository>();
        _kernel = new StandardKernel(new TestModule());
        fakePersonRepository = _kernel.Get<IPersonRepository>();
    }



    [TestCase(fakePersonRepository)]
    [TestCase(realPersonRepository)]
    public void CheckRepositoryIsEmptyOnStart(IPersonRepository personRepository)
    {
        if (personRepository == null)
        {
            throw new NullReferenceException("Person Repostory never Injected : is Null");
        }
        var records = personRepository.GetAllPeople();

        Assert.AreEqual(0, records.Count());
    }

, но он требует постоянного выражения.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Атрибуты являются украшением во время компиляции для атрибута, поэтому все, что вы помещаете в атрибут TestCase, должно быть константой, которую может разрешить компилятор.

[TestCase(typeof(FakePersonRespository))]
[TestCase(typeof(PersonRespository))]
public void CheckRepositoryIsEmptyOnStart(Type personRepoType)
{
    // do some reflection based Activator.CreateInstance() stuff here
    // to instantiate the incoming type
}

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

Возможное решение может быть примерно таким:

[TestCase("FakePersonRepository")]
[TestCase("TestPersonRepository")]
public void CheckRepositoryIsEmptyOnStart(string repoType)
{
    // Write a helper class that accepts a string and returns a properly 
    // instantiated repo instance. 
    var repo = PersonRepoTestFactory.Create(repoType);

    // your test here
}

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

1 голос
/ 17 марта 2011

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

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