簡體   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