![](/img/trans.png)
[英]Moq returns the same result for different IEnumerable parameter setups
[英]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.