【问题标题】:NUnit test fails because object is already in memoryNUnit 测试失败,因为对象已经在内存中
【发布时间】:2019-11-23 03:38:49
【问题描述】:

我正在尝试运行多个单元测试(通过在 Visual Studio 中按 Run All)。当我使用 Test>Run>All Tests 运行所有测试时,下面的测试失败,但是当我运行单个测试时(通过在测试资源管理器中右键单击测试本身)它成功。我相信我的 Setup 和 TearDown 配置错误,但我不确定缺少什么。

错误:

消息:System.ArgumentException:已添加具有相同键的项目。键:System.Object[]

我的代码:

[TestFixture]
public class GCLandingUserModelTest
{
    DbContextOptions<GreenCardContext> gcopt = new DbContextOptionsBuilder<GreenCardContext>()
        .UseInMemoryDatabase(databaseName: "GreenCardSite").Options;

    private GreenCardContext _mockGC;

    [SetUp]
    public void InitData()
    {
        _mockGC = new GreenCardContext(gcopt);
    }

    [TearDown]
    public void ClearData()
    {
        _mockGC = null;
    }

    [Test]
    public void TestAddObjMoq()
    {
            // Insert seed data into the database using one instance of the context
            _mockGC.UserRolePrice.Add(new UserRolePrice { LGID = 1, UserRoleId = -1 });
            _mockGC.SaveChanges();
            Assert.AreEqual(1, _mockGC.UserRolePrice.ToList().Count, $"UserRolePrice not added to context");

            //verify that obj created and changes were saved on the Mock Context
            int objlgid = _mockGC.UserRolePrice.Where(x => x.UserRoleId == -1).Select(x => x.LGID).First();
            Assert.AreEqual(1, objlgid,$"The returned lgid was: {objlgid}");
    }
}

【问题讨论】:

  • 为什么每次都在 Setup 中创建一个新的 gcopt?
  • @d.moncada 我试图强迫自己编写不依赖于彼此的测试。为了做到这一点,我在 Setup 方法中的每个测试之前清除上下文对象

标签: c# nunit in-memory-database


【解决方案1】:

也许您需要清除内存中的数据存储。

_mockGC.Database.EnsureDeleted();

DatabaseFacade.EnsureDeleted Method

确保上下文的数据库不存在。如果确实如此 不存在,不采取任何行动。如果它确实存在,那么数据库是 已删除。

警告:整个数据库都被删除了,并且不做任何努力 仅删除模型为此使用的数据库对象 上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2012-06-10
    • 2015-11-25
    • 2023-01-20
    • 2012-03-25
    • 2013-06-29
    相关资源
    最近更新 更多