簡體   English   中英

XUnit 測試起訂量失敗

[英]XUnit Test Moq failing

我是 XUnit 和 Moq 的新手。 我正在嘗試一個簡單的測試,但無法讓它工作。

我有 7 條測試記錄,想為我的測試添加第 8 條。

我的測試總是以原來的 7 條測試記錄而不是 8 條失敗。

我已經按照以下設置了我的測試..

public class CreateHandlerTests
{
    private readonly Mock<IUnitOfWork> _mockUnitOfWork;
    private readonly Mock<IGenericRepository<ServerAccess>> _mockRepo;

    public CreateHandlerTests()
    {
        _mockUnitOfWork = new Mock<IUnitOfWork>();
        _mockRepo = new Mock<IGenericRepository<ServerAccess>>();
    }

    [Fact]
    public async Task ServerAccess_Created()
    {
        var list = MockData.GetServerAccessList(); // 7 test records
        
        _mockRepo.Setup(x => x.CountAsync()).ReturnsAsync(list.Count);

        _mockRepo.Setup(x => x.Add(It.IsAny<ServerAccess>())).Callback<ServerAccess>(item => list.Add(item));

        _mockUnitOfWork.Setup(x => x.Repository<ServerAccess>()).Returns(_mockRepo.Object);
        
        var before = await _mockRepo.Object.CountAsync();

        var sut = new CreateHandler(_mockUnitOfWork.Object);

        await sut.Execute(new CreateCommand()
        {
            AccessMethod = "New server access method",
            Description = "New description"
        });

        var after = await _mockRepo.Object.CountAsync();

        // Assert
        Assert.True(after==8);
    }
    ...
}  

看來,當我的命令處理程序添加記錄時,我的 Mock IGenericRepository 中的 Add 方法沒有被調用。

下面是我的 IUnitOfWork 界面

public interface IUnitOfWork
{
    IGenericRepository<TEntity> Repository<TEntity>() where TEntity : BaseEntity;
    Task<int> Complete();
}

這是我的命令處理程序實現

public class CreateHandler : ICommandHandler<CreateCommand>
{
    private readonly IUnitOfWork _unitOfWork;

    public CreateHandler(IUnitOfWork unitOfWork)
    {
        _unitOfWork = Guard.Against.Null(unitOfWork, nameof(unitOfWork));
    }

    public async Task Execute(CreateCommand command)
    {
        var serverAccess = new ServerAccess()
        { 
            AccessMethod = command.AccessMethod,
            Description = command.Description
        };

        _unitOfWork.Repository<ServerAccess>().Add(serverAccess);

        await _unitOfWork.Complete();
    }
}   

我在模擬設置中錯過了什么嗎?

任何幫助表示贊賞。

問題是因為您返回的是固定值

_mockRepo.Setup(x => x.CountAsync()).ReturnsAsync(list.Count);

上面是一樣的

_mockRepo.Setup(x => x.CountAsync()).ReturnsAsync(7);

因為它是用固定值設置的,所以每次都會返回 7。

使用每次調用預期成員時都會調用的函數/委托。

[Fact]
public async Task ServerAccess_Created() {
    var list = MockData.GetServerAccessList(); // 7 test records
    
    _mockRepo
        .Setup(x => x.CountAsync())
        .ReturnsAsync(() => list.Count); //delegate invoked each time 

    _mockRepo
        .Setup(x => x.Add(It.IsAny<ServerAccess>()))
        .Callback(ServerAccess item => list.Add(item)); //delegate invoked each time 

    _mockUnitOfWork
        .Setup(x => x.Repository<ServerAccess>())
        .Returns(_mockRepo.Object); //fixed value
    
    int before = await _mockRepo.Object.CountAsync();

    CreateHandler sut = new CreateHandler(_mockUnitOfWork.Object);

    await sut.Execute(new CreateCommand() {
        AccessMethod = "New server access method",
        Description = "New description"
    });

    int after = await _mockRepo.Object.CountAsync();

    // Assert
    Assert.True(after == 8);
}

但是,上述測試應該被簡化,以根據被測對象斷言實際的預期行為

[Fact]
public async Task ServerAccess_Created() {
    //Arrange
    _mockUnitOfWork
        .Setup(x => x.Repository<ServerAccess>())
        .Returns(_mockRepo.Object);
    
    CreateHandler sut = new CreateHandler(_mockUnitOfWork.Object);

    //Act
    await sut.Execute(new CreateCommand() {
        AccessMethod = "New server access method",
        Description = "New description"
    });

    // Assert        
    _mockRepo.Verify(x => x.Add(It.IsAny<ServerAccess>());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM