繁体   English   中英

如何为 SaveChangesAsync() 编写单元测试用例

[英]How to write unit test case for SaveChangesAsync()

我正在为我的 Entity Framework Core SaveAsync方法编写单元测试用例。

try 
{
    // Here add business logic to insert record in to new database
    var dbObj = new TableName()
                    {
                        Code = 1,
                        Description = "test"
                    };
    _ = _dbContext.TableName.AddAsync(dbObj);
    _ = _dbContext.SaveChangesAsync(context.CancellationToken);
}
catch (Exception ex)
{
    _logger.LogCritical($"{GetType().Name}:{nameof(Consume)} {ex}");
}

await Task.CompletedTask;

我已经通过 mocking 编写了单元测试用例:

Mock<MyDbContext> dbContext = new();
var data = return new List<TableName>()
                      {
                          new TableName
                              {
                                  Id = 1,
                                  Description = "test"
                              }
                      };

dbContext.Setup(r => r.TableName).ReturnsDbSet(data);
dbContext.Setup(r => r.SaveChangesAsync(It.IsAny<CancellationToken>())).ReturnsAsync(1);

// Check that each method was only called once.
//dbContext.Verify(x => x.TableName.Add(It.IsAny<TableName>()), Times.Once());
dbContext.Verify(x => x.SaveChangesAsync(It.IsAny<CancellationToken>()), Times.Once());

以下是我得到的结果

Moq.MockException:预期对模拟调用一次,但为 0 次

在调试测试用例时,我得到以下信息。

首先在try catch块中加入await,否则不会catch excption

try 
{
    // Here add business logic to insert record in to new database
    var dbObj = new TableName()
                    {
                        Code = 1,
                        Description = "test"
                    };
    _ = await _dbContext.TableName.AddAsync(dbObj);
    _ = await _dbContext.SaveChangesAsync(context.CancellationToken);
}

//remove this line

    await Task.CompletedTask;

异步编程相关文档

你可以查看与测试非查询场景相关的文档

我尝试如下:

假设一个 controller:

public async Task<IActionResult> Create([Bind("Id,Name")] SomeEntity someEntity)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    await _context.AddAsync(someEntity);
                    await _context.SaveChangesAsync();
                }
                catch (Exception e)
                {

                }
                return RedirectToAction(nameof(Index));
            }
            return View(someEntity);
        }

测试:

public class UnitTest1
    {
        [Fact]
        public  async Task Test1()
        {
            var mockset = new Mock<DbSet<SomeEntity>>();
            var mockdbcontext = new Mock<WebApplication8Context>(new DbContextOptions<WebApplication8Context>() );
            mockdbcontext.Setup(x=>x.SomeEntity).Returns(mockset.Object);
            var a = mockdbcontext.Object;

            var controller = new SomeEntitiesController(mockdbcontext.Object);

            await controller.Create(new SomeEntity() { Name = "someName" });

            
            mockdbcontext.Verify(x => x.SaveChangesAsync(default(CancellationToken)), Times.Once);
        }
    }

结果:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM