C# net core 2.0 xunit控制器,使用Mock进行依赖项注入,该控制器为空

C# net core 2.0 xunit控制器,使用Mock进行依赖项注入,该控制器为空,c#,.net-core,dependency-injection,moq,xunit,C#,.net Core,Dependency Injection,Moq,Xunit,我正在做一个netcore2.0restapi应用程序 我正在对接口IContactBiz和类ContactBiz使用依赖项注入 IContactBiz的定义如下 public interface IContactBiz { ReturnModel Add(List<ContactEntity> lstContactEntity, ContactEntity contact); } public class ContactController : Controller {

我正在做一个
netcore2.0restapi
应用程序

我正在对接口
IContactBiz
和类
ContactBiz
使用依赖项注入

IContactBiz的定义如下

public interface IContactBiz
{
    ReturnModel Add(List<ContactEntity> lstContactEntity, ContactEntity contact); 
}
public class ContactController : Controller
{
    private readonly IContactBiz _contactBiz;

    public ContactController(IContactBiz contactbiz)
    {
        _contactBiz = contactbiz;
    }

   //...
我在控制器上有一个Post方法,在这里我从
ContactBiz
类调用Add()方法

[HttpPost]
public IActionResult Post([FromBody]ContactModel contact)
{
    ReturnModel errorModel = new ReturnModel();

    //...

    errorModel = _contactBiz.Add(lstContactEntity, contactEntity);

    //...
 }
当我和邮递员一起运行时,它运行得很好。。我从ContactBiz.cs访问Add()方法并检索数据

但是我有一个
xUnit
项目来测试它,我想使用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);
    }
}
公共类ContactControllerTest
{
接触器控制器(u控制器),;
公共联系人控制器测试()
{
Mock mockRepo=新Mock();
_控制器=新的ContactController(contactbiz:mockRepo.Object);
}
[事实]
public void InsertContact()
{
ContactModel cm=新的ContactModel()
{
Address=“data”,
City=“data”,
Company=“data”,
Email=“data”,
Name=“data”,
PhonePersonal=“数据”,
PhoneWork=“数据”,
State=“data”,
生日=DateTime.Today.AddYears(-30)
};
var actionResult=_controller.Post(cm);
}
}
我在调试模式下运行它

当我到达终点时
errorModel=\u contactBiz.Add(lstContactEntity,contactEntity)。。是空的

ContactBiz类中的Add()方法,它从未被调用

我想我没有设置将哪个类映射到contactBiz
接口

我在startup.cs中的行

public void ConfigureServices(IServiceCollection services)
{  
    services.AddSingleton<IContactBiz, ContactBiz>();
}
services.AddSingleton()
无法访问Add()方法por ContactBiz类,并且
errorModel
为空

我认为问题在于我没有分配
services.AddSingleton()最小起订量

还有别的问题吗


谢谢

将模拟配置为在调用时按预期运行

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);
ReturnModel ReturnModel=new ReturnModel(){
结果=真,
};
Mock mockRepo=新Mock();
莫克雷波
.Setup(=>\u0.Add(It.IsAny(),It.IsAny()))
.退货(退货模式);
_控制器=新的ContactController(contactbiz:mockRepo.Object);

否则它将返回返回类型的默认值

当前状态下的问题不完整,因此不清楚。如果没有一个能澄清你的具体问题或额外细节来强调到底做了什么,那么就很难重现问题,从而更好地理解实际问题。Nkosi,很抱歉我的解释。。。我只是安排一些评论。。谢谢你需要出示被测对象。大部分细节都被遗漏了。添加的注释没有提供更多关于代码作用的细节。Nkosi,我只是添加了我正在执行的所有步骤,我的控制器和测试单元。。。希望有帮助,谢谢。
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);