使用 Mock 进行依赖注入的 net core 2.0 xunit 控制器为空 [英] net core 2.0 xunit Controller with dependency injection using Mock is null
问题描述
我正在做一个 Net Core 2.0 Rest Api
应用程序.
I am doing an Net Core 2.0 Rest Api
application.
我正在使用接口 IContactBiz
和类 ContactBiz
的依赖注入.
I am using dependency injection with Interface IContactBiz
and class ContactBiz
.
IContactBiz 是这样定义的
IContactBiz is defined like this
public interface IContactBiz
{
ReturnModel Add(List<ContactEntity> lstContactEntity, ContactEntity contact);
}
我的 ContactBiz 类
My ContactBiz class
public class ContactBiz: IContactBiz
{
public ReturnModel Add(List<ContactEntity> lstContactEntity, ContactEntity contact)
{
contact.ID = Guid.NewGuid().ToString();
lstContactEntity.Add(contact);
return new ReturnModel()
{
Result = true,
};
}
}
在startup.cs中设置
It is set in startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IContactBiz, ContactBiz>();
}
我有一个 ContactController,定义如下
I have a ContactController, defined like this
public class ContactController : Controller
{
private readonly IContactBiz _contactBiz;
public ContactController(IContactBiz contactbiz)
{
_contactBiz = contactbiz;
}
//...
我的控制器上有 Post 方法,我从 ContactBiz
类调用 Add() 方法
I have Post Method on my controller where i call Add() method from ContactBiz
class
[HttpPost]
public IActionResult Post([FromBody]ContactModel contact)
{
ReturnModel errorModel = new ReturnModel();
//...
errorModel = _contactBiz.Add(lstContactEntity, contactEntity);
//...
}
当我使用 Postman 运行它时,它工作正常.我从 ContactBiz.cs 访问 Add() 方法并检索数据.
When I run it with Postman, it works fine.. I reach Add() method from ContactBiz.cs and retrieve data.
但是我有一个 xUnit
项目来测试它,我想使用 Moq ..
But I have a xUnit
project to test it, and I want to use Moq..
我有
public class ContactControllerTest
{
ContactController _controller;
public ContactControllerTest()
{
Mock<IContactBiz> mockRepo = new Mock<IContactBiz>();
_controller = new ContactController(contactbiz: mockRepo.Object);
}
[Fact]
public void InsertContact()
{
ContactModel cm = new ContactModel()
{
Address = "data",
City = "data",
Company = "data",
Email = "data",
Name = "data",
PhonePersonal = "data",
PhoneWork = "data",
State = "data",
BirthDate = DateTime.Today.AddYears(-30)
};
var actionResult = _controller.Post(cm);
}
}
我在调试模式下运行它...
I run it in debug mode...
当我到达终点线时errorModel = _contactBiz.Add(lstContactEntity, contactEntity);
在 Post() 方法中.. 为空...
When I reach the line
errorModel = _contactBiz.Add(lstContactEntity, contactEntity);
in Post() method.. is null...
来自 ContactBiz 类的 Add() 方法,它永远不会被调用
Add() method from the class ContactBiz it is never called
我想我没有设置哪个类映射到 _contactBiz
接口
I think i am missing to set which class has is mapped to _contactBiz
interface
我在 startup.cs 中的那一行
the line I have in startup.cs
services.AddSingleton
无权访问 ContactBiz 类的 Add() 方法,并且 errorModel
为 null.
services.AddSingleton<IContactBiz, ContactBiz>();
Do not have access to Add() method por ContactBiz class, and errorModel
is null.
我认为问题在于我没有在最小起订量中分配 services.AddSingleton
?
I think the problem is that I did not I assign services.AddSingleton<IContactBiz, ContactBiz>();
in Moq?
还有什么问题吗?
谢谢
推荐答案
配置模拟在调用时按预期运行
Configure the mock to behave as expected when invoked
ReturnModel returnModel = new ReturnModel() {
Result = true,
};
Mock<IContactBiz> mockRepo = new Mock<IContactBiz>();
mockRepo
.Setup(_ => _.Add(It.IsAny<List<ContactEntity>>(), It.IsAny<ContactEntity>()))
.Return(returnModel);
_controller = new ContactController(contactbiz: mockRepo.Object);
否则会返回返回类型的默认值
otherwise it will return the default value of the return type
这篇关于使用 Mock 进行依赖注入的 net core 2.0 xunit 控制器为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!