首页 > 解决方案 > 使用 InMemoryDatabase 返回计数为 0 的 NUnit 测试

问题描述

我正在使用 InMemoryDatabase 实现一些 NUnit 测试。

当我有测试保存在数据库中时,该测试已经通过,但是如果我想在单独的测试方法中返回列表作为结果。该列表是空的,它已返回 0 作为计数,而不是 300。

测试方法GetPaymentCalendar_WithFactoryIdRequest_ReturnCount失败。

有人可以给我一个提示,我做错了什么?

public class PaymentCalendarRequestServiceTests
{
    private IPaymentCalendarService _paymentCalendarService;
    private ApplicationDbContext _context;
    private IUnitOfWork _unitOfWork;

    [SetUp]
    public void Init()
    {
        var options = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase("TestDb")
            .Options;
        var currentUserServiceMock = new Mock<ICurrentUserService>(MockBehavior.Strict);
        currentUserServiceMock.Setup(_ => _.UserId).Returns(Guid.NewGuid().ToString);
        var dateTimeServiceMock = new Mock<IDateTimeService>(MockBehavior.Strict);
        dateTimeServiceMock.Setup(_ => _.Now).Returns(DateTime.Now);
        _context = new ApplicationDbContext(options, currentUserServiceMock.Object, dateTimeServiceMock.Object);
        _unitOfWork = new UnitOfWork(_context, dateTimeServiceMock.Object, currentUserServiceMock.Object);

        _paymentCalendarService = new PaymentCalendarService(_unitOfWork);
    }

    [Test]
    public void CreatePaymentCalendar_WithValidPaymentCalendarCreateRequest_ReturnSuccess()
    {
        var request = new List<PaymentCalendarCreateRequest>();
        for (int i = 0; i < 25 * 12; i++)
        {
            request.Add(
                new PaymentCalendarCreateRequest
                {
                    Month = DateTime.Now.AddMonths(i).Month,
                    Year = DateTime.Now.AddMonths(i).Year,
                    IsClosed = false,
                    FactoryId = "25aa09a6-006c-4571-ae45-68b697a54fec"
                }
            );
        }
        var result = _paymentCalendarService.CreatePaymentCalendar(request).Result;
        Assert.IsTrue(result.Succeeded);
    }

    [Test]
    public void GetPaymentCalendar_WithFactoryIdRequest_ReturnCount()
    {
        var factoryId = "25aa09a6-006c-4571-ae45-68b697a54fec";
        var response = _paymentCalendarService.GetPaymentCalendar(factoryId).Result;
        Assert.AreEqual(25*12,response.Count);
    }
}

标签: c#.net-corenunit-3.0

解决方案


来自 NUnit 文档:

设置

此属性在 TestFixture 内部使用,以提供一组公共函数,这些函数在调用每个测试方法之前执行。

因此,您的 [SetUp] 中的所有内容都将在每次测试之前完成。

这意味着,您的数据库每次都将使用空方案进行初始化


推荐阅读