Entity Framework Интеграция тесты DropCreateDatabaseAlways не клиринговые базы данных между испытанием - PullRequest
5 голосов
/ 05 декабря 2011

Я пишу набор интеграционных тестов (модульные тесты с MS Test, которые проверяют, что Entity Framework 4.2 правильно сохраняет все классы в базе данных).

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

Есть идеи?

public class EmptyDataInitializer : DropCreateDatabaseAlways<myContext>
{
    protected override void Seed(myContext db)
    {
        //Do Nothing Create Empty Database
        db.SaveChanges();
        base.Seed(db);
    }
}

A Урезанная версия устройства / Интеграционные тесты

[TestClass]
public class PersistanceTests
{
    //Creating two instances of our Repository so that we can make sure that we are reading from our database rather than in-memory
    private myContext _db;
    private myContext _dbResults;
    private readonly ISettings _configSettings;

    public PersistanceTests()
    {
        _configSettings = MockRepository.GenerateStub<ISettings>();
        _configSettings.ConnectionString = "data source=.;initial catalog=myContext_Test; Integrated Security=SSPI; Pooling=false";

        Database.SetInitializer(new EmptyDataInitializer());
    }

    //This is called a single time after the last test has finished executing
    [TestCleanup]
    public void TearDownTest()
    {
       _db.Dispose();
        _db = null;
       _dbResults.Dispose();
        _dbResults = null;
    }

    //This is called each time prior to a test being run

    [TestInitialize]
    public void SetupTest()
    {          
        _db = new myContext(_configSettings);
        _dbResults = new myContext(_configSettings);

        // This forces the database to initialise at this point with the initialization data / Empty DB
        var count = _db.Accounts.Count();
        var resultCount = _dbResults.Accounts.Count();
        if (count != resultCount) throw new InvalidOperationException("We do not have a consistant DB experiance.");
    }
    [TestMethod]
    public void OrganisationPersistanceTest()
    {
        // Arrange
        var apple = new Organisation { Name = "Apple" };
        _db.Organisations.Add(apple);
        // Act
        _db.SaveChanges();
        var organisationsCount = _dbResults.Organisations.Count();
        var organisationsAppleCount = _dbResults.Organisations.Where(a => a.Id == apple.Id).Count();
        var result = _dbResults.Organisations.FirstOrDefault(a => a.Id == apple.Id);
        // Assert
        Assert.IsTrue(organisationsCount == 1, string.Format("Organisations Count Mismatch -  Actual={0}, Expected={1}", organisationsCount, 1));
        Assert.IsTrue(organisationsAppleCount == 1, string.Format("Apple Organisations Count Mismatch -  Actual={0}, Expected={1}", organisationsAppleCount, 1));
        Assert.IsNotNull(result, "Organisations Result should not be null");
        Assert.AreEqual(result.Name, apple.Name, "Name Mismatch");
    }

    //A Unit test
    [TestMethod]
    public void OrganisationWithNumberOfPeople_PersistanceTest()
    {
        // Arrange
        var person = new Person { Firstname = "Bea" };
        var anotherPerson = new Person { Firstname = "Tapiwa" };
        var apple = new Organisation { Name = "Apple" };
        apple.AddPerson(person);
        apple.AddPerson(anotherPerson);
        _db.Organisations.Add(apple);
        // Act
        _db.SaveChanges();
        var organisationsCount = _dbResults.Organisations.Count();
        var organisationsAppleCount = _dbResults.Organisations.Where(a => a.Id == apple.Id).Count();
        var result = _dbResults.Organisations.FirstOrDefault(a => a.Id == apple.Id);
        var peopleCountInOrganisation = result.People.Count();
        // Assert
        Assert.IsTrue(organisationsCount == 1, string.Format("Organisations Count Mismatch -  Actual={0}, Expected={1}", organisationsCount, 1));
        Assert.IsTrue(organisationsAppleCount == 1, string.Format("Apple Organisations Count Mismatch -  Actual={0}, Expected={1}", organisationsAppleCount, 1));
        Assert.IsNotNull(result, "Organisations Result should not be null");
        Assert.AreEqual(result.People.Count, peopleCountInOrganisation, "People count mismatch in organisation Apple - Actual={0}, Expected={1}", peopleCountInOrganisation, 2); 
        Assert.AreEqual(result.Name, apple.Name, "Name Mismatch");
   }

}

Пройдя по тестам, я вижу вызываемые методы SetupTest и TearDownTest, но кажется, что между тестами база данных не очищается.

Ответы [ 2 ]

7 голосов
/ 06 декабря 2011

Хорошо, даже лучше ответ - добавьте базу данных. Инициализируйте (сила: правда);в метод TestInitialize.

[TestInitialize]
public void SetupTest()
{          
    _db = new myContext(_configSettings);
    _db.Database.Initialize(force: true);
    _dbResults = new myContext(_configSettings);

    // This forces the database to initialise at this point with the initialization data / Empty DB
    var count = _db.Accounts.Count();
    var resultCount = _dbResults.Accounts.Count();
    if (count != resultCount) throw new InvalidOperationException("We do not have a consistant DB experiance.");
}
2 голосов
/ 10 апреля 2014

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

public abstract class TestingHelper
{
        public static void ClearDatabase()
        {
            DatabaseContext myDbContext = new DatabaseContext();
            myDbContext.Database.Delete();
            myDbContext.Database.Create();
            //FillDatabase(lawyers); //<- OPTIONAL if you want to add rows to any type tables
        }
}

И затем использую его в настройках вашего теста:

[SetUp]
public void MyTests_SetUp()
{
      TestingHelper.ClearDatabase();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...