NUnit OneTimeTearDown 垃圾收集最佳实践

NUnit OneTimeTearDown Garbage collection best practice

首先,我在 class

的开头声明了变量
        private AddressRepository sut;
        private Mock<TransactionDbContext> mockDBContext;

在 OneTimeSetUp 中,我创建了设置代码

        [OneTimeSetUp]
        public void Setup()
        {
            var options = new DbContextOptionsBuilder<TransactionDbContext>().Options;
            mockDBContext = new Mock<TransactionDbContext>(options);
            var dbSetMock = new Mock<DbSet<Address>>();
            var data = ValueTask.FromResult(new Address() { AddressLine1 = "address line 1" 
        });
            dbSetMock.Setup(s => s.FindAsync(It.IsAny<Guid>())).Returns(data);
            mockDBContext.Setup(s => s.Set<Address>()).Returns(dbSetMock.Object);

        }

问题,我是否需要编写额外的代码来处理垃圾收集,或者我应该取消分配所有变量以加快 GC 的速度?

        [OneTimeTearDown]
        public void TearDown()
        {
            //unassign all variables
            mockDBContext = null;
            sut = null;
            
           //Possibly call GC.Collect?
            GC.Collect();
        }

任何编码建议将不胜感激。

您应该处置您获得的任何一次性外部资源。您在哪里执行此操作取决于您从何处获取资源。

  1. 如果您在测试夹具构造函数中获取它,则让 NUnit 处理它。您可以通过让夹具 class 实现 IDispose 来做到这一点。

  2. 如果在OneTimeSetUp中获取,则在对应的OneTimeTearDown中销毁。

  3. 如果你在SetUp中获得它,那么在相应的TearDown中处理它。

  4. 如果您在 TestMethod 中获取它,则在该方法之前处理它 returns。最简单的方法是通过 using.

综上所述,您的示例似乎没有获取任何 一次性外部资源。所以我不会做任何这些事情。 :-)

通常,人们花在弄清楚过于复杂的代码上的时间超过了效率上的任何小优势。所以等到你看到性能问题再修复它。