2016-04-28 2 views
1

Я не уверен, что истинные модульные тесты должны строго взаимодействовать с внешними системами, такими как базы данных, но моя - идея, являющаяся моим кодом настройки, гарантирует, что БД находится в определенном состоянии, тогда мои модульные тесты ожидают определенных результатов от методов, которые вызываются; Мне нужно проверить, что код доступа к БД работает правильно.Совместное использование данных настройки базы данных между несколькими тестовыми классами модулей

Я хочу использовать те же данные теста БД в нескольких тестовых классах, а не копировать их в каждый класс '[TestInitialize], и мне интересно, как это сделать лучше всего. Варианты, кажется, включают в себя:

  1. Бросьте все это во внешнем .sql сценарии и запустить этот
  2. Какая-то вспомогательный класс со статическим методом

Я предпочел бы код для обновления БД является частью моего кода на C#, но задавался вопросом, есть ли более типичный способ, которым могут справиться проекты MSTest?

+0

ссылка на внешние системы - плохая идея. Я предпочитаю создать слой между уровнем доступа к данным и вашим бизнес-слоем. Например, есть интерфейс с методами и свойствами доступа к данным. и это можно проверить. –

+0

Наверное, я согласен, но вот как это устроено. Назовите это другим типом теста, если это сделает вас счастливее :) Интеграция? –

+0

Нужно ли сбросить Db для каждого теста или использовать его как все тесты. – Nkosi

ответ

2

Вы можете использовать наследование для совместного использования установочных данных между несколькими тестовыми классами.

Вы можете создать базовый тестовый класс и наследовать его другие классы (включая [TestInitialize], который будет вызываться для каждого теста).

Посмотрите на эту статью, Structuring Unit Tests, который показывает, как использовать тестовую структуру для тестов, которые имеют общий код для всех тестов

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

[TestClass] 
public partial class DbTests { 
    protected DbContext db;  

    [TestInitialize] 
    public virtual void Init() { 
     //Virtual so it could be overridden in derived classes if needed. 
     //...check the DB-access code is doing the right thing. 
    } 

    [TestClass] 
    public class Test1 : DbTests { 
     [TestMethod] 
     public void Should_Do_Some_Test(){...} 

     [TestMethod] 
     public void Should_Do_Some_Db_Test(){...} 
    } 

    [TestClass] 
    public class Test2 : DbTests { 
     [TestMethod] 
     public void Should_Do_Some_Other_Test(){...} 
    }  
} 

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