Контроллер xunit net core 2.0 с внедрением зависимостей с использованием Mock is null - PullRequest
0 голосов
/ 18 марта 2020

Я делаю заявление 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 на моем контроллере, где я вызываю Add () метод из ContactBiz класс

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

    //...

    errorModel = _contactBiz.Add(lstContactEntity, contactEntity);

    //...
 }

Когда я запускаю его с Почтальоном, он работает нормально .. Я достигаю метода Add () из ContactBiz.cs и извлекаю данные.

Но у меня есть 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);
    }
}

Я запускаю его в режиме отладки ...

Когда Я достигаю строки errorModel = _contactBiz.Add(lstContactEntity, contactEntity); в методе Post () .. является нулевым ...

Метод Add () из класса ContactBiz никогда не вызывается

Я думаю, что мне не хватает, чтобы установить какой класс сопоставлен с _contactBiz interface

строкой, которую я имею в startup.cs

services.AddSingleton<IContactBiz, ContactBiz>(); Нет доступа к методу Add () для класса ContactBiz и errorModel это н Улл.

Мне кажется, проблема в том, что я не назначил services.AddSingleton<IContactBiz, ContactBiz>(); в Moq?

Есть ли другая проблема?

Спасибо

1 Ответ

0 голосов
/ 19 марта 2020

Сконфигурируйте mock для правильного поведения при вызове

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

, в противном случае он вернет значение по умолчанию типа возврата

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...