asp.net 如何使用xUnit放置方法

mgdq6dx1  于 2023-01-14  发布在  .NET
关注(0)|答案(1)|浏览(136)

我尝试使用xUnit来测试Update方法,但我不知道如何做到这一点,下面是我的代码:
将方法放入控制器:

[HttpPut]
[Route("{id}")]
public IActionResult Put([FromBody]BookDto book, [FromRoute]int id)
{
    if (!ModelState.IsValid)
    {
        return BadRequest();
    }
    var isUpdated = _service.Update(book);
    if (!isUpdated)
    {
        return NotFound();
    }
    return Ok();
}

BookService更新方法:

public bool Update(BookDto book)
{
    var bookDb = _context.Books.FirstOrDefault(x => x.Id == book.Id);
    if(bookDb == null)
    {
        return false;
    }
    bookDb.Title = book.Title;
    _context.SaveChanges();
    var existingAuthors = _context.Book_Authors.Where(x => x.BookId == book.Id).ToList();
    _context.Book_Authors.RemoveRange(existingAuthors);
    _context.SaveChanges();

    foreach (var AuthorsId in book.AuthorsId)
    {
        var newBookAuthors = new Book_Author()
        {
            BookId = book.Id,
            AuthorId = AuthorsId
        };
        _context.Book_Authors.Add(newBookAuthors);
    }
    _context.SaveChanges();

    return true;
}

登记日期:

public class BookDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public List<int> AuthorsId { get; set; }
}

对于如何使用Moq编写PutMethod测试有什么建议吗?

5us2dqdw

5us2dqdw1#

  • 我建议收集测试用例:
    *给定无效的帐簿我调用put然后返回错误请求
    *给定不存在的帐簿
    调用put返回not Found
    *给定现有帐簿
    调用put然后返回ok
  • 我建议对每个测试用例使用AAA模式,例如:
    *安排:设置一个图书服务模拟,每当有人调用更新时,它都会返回false
    *Act:调用控制器的put方法
    *Assert:验证返回的结果是否未按预期找到
  • 试着整理一下。比如
public void GivenANonExistingBook_WhenICallPut_ThenItReturnsNotFound()
{
    //Arrange
    var book = ...;
    var serviceMock = new Mock<IBookService>();
    serviceMock.Setup(svc => svc.Update(It.IsAny<BookDto>()))
               .Returns(false);

    var sut = new YourController(serviceMock.Object);

    //Act
    var result = sut.Put(book, 0);

    //Assert
    var actionResult = result as NotFoundResult;
    Assert.IsNotNull(actionResult);
}

验证服务的Update方法是否仅使用book变量调用过一次也是一种很好的做法:serviceMock.Verify(svc => svc.Update(book), Times.Once); .

相关问题