使用 Mock 进行依赖注入的 net core 2.0 xunit 控制器为空 [英] net core 2.0 xunit Controller with dependency injection using Mock is null

查看:32
本文介绍了使用 Mock 进行依赖注入的 net core 2.0 xunit 控制器为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在做一个 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆