C # Nunit и запущенная одна и та же база данных заполняются каждый раз перед тестом - PullRequest
0 голосов
/ 18 октября 2018

У меня есть файл контекста БД Entity Framework.Как мне настроить DBContext и запускать SetUp каждый раз (чтобы очистить заполненную базу данных) перед запуском теста?Он не может видеть dbcontext в тестах NUnit.

Файл контекста DB электроники

public partial class ElectronicsContext : DbContext
{
    public ElectronicsContext()
    {
    }

    public ElectronicsContext(DbContextOptions<ElectronicsContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Product> Product { get; set; }
    public virtual DbSet<ProductCategory> ProductCategory { get; set; }

Настройка Nunit

public class TestClass
{

    [SetUp]
    public void TestProducts()
    {
        var options = new DbContextOptionsBuilder<ElectronicsContext>()
            .UseInMemoryDatabase(databaseName: "Products Test")
            .Options;

        using (var context = new ElectronicsContext(options))
        {
            context.Product.Add(new Product { ProductId = 1, ProductName = "TV", ProductDescription = "TV testing", ImageLocation = "test" , ProductCategoryId = 2});
            context.SaveChanges();
        }
    }

Сообщение об ошибке здесь

The name 'context' does not exist in the current context    

    [Test]
    public void TestProductRepository()
    {
        ProductRepository productRepository = new ProductRepository(context);
        Assert.AreEqual("TV", productRepository.GetById(1).ProductName);
    }
}

Альтернативная идея для SetUp также не работала:

    [SetUp]
    public void TestProducts()
    {
        var options = new DbContextOptionsBuilder<ElectronicsContext>()
            .UseInMemoryDatabase(databaseName: "Products Test")
            .Options;

        ElectronicsContext context = new ElectronicsContext(options);

1 Ответ

0 голосов
/ 18 октября 2018

Создать закрытый член класса теста, который может быть создан в методе SetUp и использован в методах теста.

Поскольку NUnit создаст экземпляр TestClass один раз для всех тестов в классе, вы не можетеиспользуйте readonly член.Контекст должен быть переназначен (сброшен) для каждого теста, чтобы держать их изолированными друг от друга.

public class TestClass
{
    private DbContext _context;

    [SetUp]
    public void SetUp()
    {
        var options = 
            new DbContextOptionsBuilder<ElectronicsContext>()
                .UseInMemoryDatabase(databaseName: "Products Test")
                .Options;

        // new instance of ElectronicsContext will be created for every test.
        _context = new ElectronicsContext(options);

        // Use _context to insert initial data required for the test

    }

    [TearDown]
    public void TearDown()
    {
        _context.Dispose();
    }

    [Test]
    public void RunTest()
    {
        // run test
        // assert
        _context.Products.Count().Should().Be(10)
    }
}

Представьте, что тестовое устройство - это просто класс ac #, методы которого, помеченные атрибутом Test, выполняются последовательно.

var test = new TestClass();
// first test
test.SetUp();    // create db context
test.RunTest();  // use db context
test.TearDown(); // dispose db context

// second test
test.SetUp();       // create db context
test.RunTest_Two(); // use db context
test.TearDown();    // dispose db context
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...