【问题标题】:net core 2.0 xunit Controller with dependency injection using Mock is null使用 Mock 进行依赖注入的 net core 2.0 xunit 控制器为空
【发布时间】:2020-06-30 00:03:18
【问题描述】:

我正在做一个Net Core 2.0 Rest Api 应用程序。

我正在使用接口IContactBiz 和类ContactBiz 的依赖注入。

IContactBiz 是这样定义的

public interface IContactBiz
{
    ReturnModel Add(List<ContactEntity> lstContactEntity, ContactEntity contact); 
}

我的 ContactBiz 类

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中设置

public void ConfigureServices(IServiceCollection services)
{  
    services.AddSingleton<IContactBiz, ContactBiz>();
}

我有一个 ContactController,定义如下

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);

    //...
 }

当我使用 Postman 运行它时,它运行良好。我从 ContactBiz.cs 到达 Add() 方法并检索数据。

但我有一个xUnit 项目来测试它,我想使用起订量..

我有

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);
    }
}

我在调试模式下运行它...

当我到达终点线时 errorModel = _contactBiz.Add(lstContactEntity, contactEntity); 在 Post() 方法中.. 为空...

ContactBiz 类中的 Add() 方法永远不会被调用

我想我缺少设置哪个类映射到_contactBiz 接口

我在 startup.cs 中的行

services.AddSingleton&lt;IContactBiz, ContactBiz&gt;(); 无权访问 ContactBiz 类的 Add() 方法,并且errorModel 为空。

我认为问题在于我没有在 Moq 中分配services.AddSingleton&lt;IContactBiz, ContactBiz&gt;();

还有其他问题吗?

谢谢

【问题讨论】:

  • 当前状态下的问题不完整,因此不清楚。如果没有 minimal reproducible example 澄清您的具体问题或其他详细信息以突出确切已完成的工作,则很难重现问题以更好地理解问题是实际问题。
  • Nkosi,对不起我的解释...我只是安排了一些 cmets.. 谢谢
  • 你需要展示被测对象。大部分细节都被遗漏了。添加的 cmets 没有提供有关代码功能的更多详细信息。
  • Nkosi,我刚刚添加了我正在做的所有步骤,我的控制器和测试单元......希望它有所帮助,谢谢。

标签: c# .net-core dependency-injection moq xunit


【解决方案1】:

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

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);

否则会返回返回类型的默认值

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 2020-06-30
    • 2018-03-03
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2018-09-17
    相关资源
    最近更新 更多