簡體   English   中英

當為 Returns() 提供不同的值時,最小起訂量返回相同的結果

[英]Moq Returning Same Result When Supplying Different Values To Returns()

我正在為各種測試用例設置一個 Mock:

[Test]
[TestCase(0)]
[TestCase(1)]
[TestCase(4)]
public async Task Get_ReturnsAllUsers(int userCount)
{
    // Arrange
    var users = UserRepositoryTests.GenerateUsers(userCount);
    var extensionWrapper = new Mock<IDbConnectionExtensionsWrapper>();
    extensionWrapper
        .Setup(ex => ex.Get<User>(It.IsAny<IDbConnection>(), It.IsAny<IDbTransaction>(), It.IsAny<int>()))
        .Returns(Task.FromResult(users));

    var connection = new Mock<IDbConnection>();
    connection
        .Setup(conn => conn.BeginTransaction())
        .Returns(new Mock<IDbTransaction>().Object);

    var repository = new UserRepository(connection.Object, extensionsWrapper.Object);

    var usersFromRepository = await repository.Get();

    Assert.AreEqual(userCount, usersFromRepository.Count());
}

GenerateUsers看起來像

private static IEnumerable<User> GenerateUsers(int count)
{
    using var crypto = new RNGCryptoServiceProvider();
    var salt = new byte[16];
    crypto.GetBytes(salt);
    
    var random = new Random();
    var users = new List<User>();
    for (var i = 0; i < count; i++)
    {
        users.Add(new User
        {
            Id = i,
            Username = Convert.ToString(i),
            Salt = salt,
            Hash = salt,
        });
    }

    return users;
}

相關的repository代碼看起來像

public UserRepository(IDbConnection connection, IDbConnectionExtensionsWrapper wrapper)
{
    this.Connection = connection;
    this.ConnectionWrapper = wrapper;
}

public async Task<IEnumerable<User>> Get()
{
    var users = await this.ConnectionWrapper
        .Get<User>(this.Connection);

    return users;
}

最后IDbConnectionExtensionsWrapper.Get(...)

public async Task<IEnumerable<T>> Get<T>(
    IDbConnection connection,
    IDbTransaction? transaction = null,
    int? timeout = null)
    where T : class
    => await connection.GetAllAsync<T>(transaction, timeout);

其中connection.GetAllAsync屬於Dapper.Contrib.Extensions

我遇到的問題是只有第一個TestCase成功。 每次調用IDbConnectionExtensionsWrapper.Get都會返回一個空的可枚舉,盡管我在每種情況下都設置了返回值。

事實證明,這是一種類型不匹配,讓我大吃一驚。 由於IDbConnectionExtensionsWrapper.Get(...)的簽名需要一個int? 我正在使用It.IsAny<int>()設置模擬,沒有合適的方法調用(它從未被調用)。

模擬該方法的正確方法是

extensionWrapper
    .Setup(ex => ex.Get<User>(It.IsAny<IDbConnection>(), It.IsAny<IDbTransaction?>(), It.IsAny<int?>()))
    .Returns(Task.FromResult(users));

最終使所有測試用例通過。

暫無
暫無

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

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