.net-core - 模拟存储库方法验证测试失败
问题描述
我在.NET Core应用程序中使用Moq框架和xUnit 。我有一个存储库的模拟
public interface IItemRepository<T>
{
string Add(T entity);
}
我想测试使用这个存储库的类的方法
public DefaultCartService(IItemRepository<CartItem> cartRepository)
{
_cartRepository = cartRepository;
}
public Task<GenericResponse<string>> AddItem(CartItem model)
{
var result = new GenericResponse<string>();
try
{
result.Response = _cartRepository.Add(cartItem);
}
catch(Exception ex)
{
result.Status = false;
result.Error = ex.Message;
}
return Task.FromResult(result);
}
这是一个用于包装存储库结果的通用响应类
public class GenericResponse<T>
{
public bool Status { get; set; } = true;
public T Response { get; set; }
public string Error { get; set;
}
}
这就是我为存储库预设 Mock 并调用该方法的方式
[Fact]
public void AddItem_WorkingTest()
{
//creating mock
var mock = new Mock<IItemRepository<CartItem>>();
//setting a method
mock.Setup(x => x.Add(new CartItem())).Returns("SomeGuidValue");
//creating input param
CartItemInputModelDTO inputModel = new CartItem() {BuyerId = "232", ProductId = "35435" };
//creating service class instance and passing repository mock
var _service = new DefaultCartService(_cartRepository.Object);
//calling method
var result = _service.AddItem(inputModel).Result.Response;
//verifying that mocks method been called
mock.Verify(x => x.Add(new CartItem()), Times.AtLeastOnce);
}
结果,我的测试失败,因为从未调用过存储库。而且我不明白为什么,因为我设置了没有要调用的停止方法测试结果
Moq.MockException :预期至少对模拟调用一次,但从未执行过:已
x => x.Add(CartItem)
执行调用:Mock<IItemRepository<CartItem>:2
(x):未执行调用。
解决方案
It.IsAny<CartItem>()
在设置中使用。当前设置不起作用,因为在测试中通过的实例不是设置中使用的实例。
此外,如果测试返回Task
派生结果的成员,则使测试异步
[Fact]
public async Task AddItem_WorkingTest() {
//creating mock
var mock = new Mock<IItemRepository<CartItem>>();
//setting a method
mock.Setup(x => x.Add(It.IsAny<CartItem>())).Returns("SomeGuidValue");
//creating input param
var inputModel = new CartItem() {BuyerId = "232", ProductId = "35435" };
//creating service class instance and passing repository mock
var _service = new DefaultCartService(mock.Object);
//calling method
var result = await _service.AddItem(inputModel);;
//verifying that mocks method been called
mock.Verify(x => x.Add(It.IsAny<CartItem>()), Times.AtLeastOnce);
}
如果要验证传递给模拟的实例成员,请It.Is<CartItem>()
与谓词一起使用
例如
//... omitted for brevity
mock.Verify(x => x.Add(It.Is<CartItem>(_ =>
_.BuyerId == inputModel.BuyerId
&& _.ProductId == inputModel.ProductId)), Times.AtLeastOnce);
参考起订量快速入门
推荐阅读
- javascript - 我想用 bxslider 插件创建一个全屏交叉淡入淡出幻灯片
- reactjs - 为什么路由更改会触发 .info/connected onDisconnect() 被调用?
- bash - 有没有办法在不使用 xclip 的情况下使用 bash 将图片复制到剪贴板?
- android - Bump Gradle 版本不碰撞 Android Gradle Plugin 版本
- arraylist - 为什么 Kotlin 不允许我将元素添加到数组列表
- r - 各种错误传单上传到 RPubs
- python - 给出错误结果的代码未按方面运行
- node.js - 在 GET 请求上关闭了意外的连接
- qt - 如何格式化信用卡文本编辑小部件?
- vue-router - Nuxt:如何在新标签页中打开页面