МОК в классе ЮнитТест - Unity.WebApi - PullRequest
0 голосов
/ 15 ноября 2018

Я успешно реализовал Unity.WebAPI в проекте web api.Некоторые, как новый экземпляр класса MService не создается.При запуске метода модульного теста появляется следующее сообщение об ошибке.

Невозможно получить конструктор по умолчанию для класса MServiceTests.

Класс обслуживания

    private readonly IRepository _mRepository;

    public MService(IMRepository mRepository)
    {
        _mRepository = mRepository;
    }

     public List<FUser> GetFUser()
    {
      result = _mRepository.ExecuteCommandReader()
    }

Тестовый класс

 public class MServiceTests
{
    private readonly IMRepository _mRepository;
    private readonly IMService _mService;


    public MServiceTests(IMRepository mRepository, IMService mService)
    {
        _mRepository = mRepository;
        _mService = mService;
    }




    [TestMethod]
    public void Get_Users_ReturnsUserList()
    {

        var resultList = new List<FUser>();
        resultList = _mService.GetFUser();

        Assert.IsTrue(resultList.Count > 0);

    }
}

UnityConfig

    container.RegisterType<IFService, FService>(new HierarchicalLifetimeManager());
    container.RegisterType<IMService, MService>(new HierarchicalLifetimeManager());
    container.RegisterType<ITransactionService, TransactionService>(new HierarchicalLifetimeManager());
    container.RegisterType<IMRepository, MRepository>();

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Кажется, что существует некоторая путаница в отношении того, как проводить модульное тестирование класса, который имеет зависимости.

Предположим, что тестируемый объект выглядит следующим образом

public class MService: IMService {

    private readonly IMRepository mRepository;

    public MService(IMRepository mRepository) {
        this.mRepository = mRepository;
    }

    public List<FUser> GetFUser() {
        var result = mRepository.ExecuteCommandReader();
        return result
    }
}

Чтобыпротестировав MService.GetFUser, вы создадите экземпляр класса субъекта MService и вставите все зависимости, которые когда-либо понадобятся для проверки поведения тестируемого метода.

В следующем примере теста зависимости будутиздевались с использованием Moq Mocking Framework.Вы можете так же легко создать поддельную реализацию, если пожелаете.

[TestClass]
public class MServiceTests {   
    [TestMethod]
    public void Get_Users_ReturnsUserList() {
        //Arrange 
        var expected = new List<FUser>() {
            //populate with some users
        };
        IMRepository mockRepository = new  Mock<IMRepository>();
        mockRepository.Setup(_ => _.ExecuteCommandReader()).Returns(expected);

        IMService mService = new MService(mockRepository.Object);

        //Act
        var resultList = mService.GetFUser();

        //Assert
        Assert.IsTrue(resultList.Count > 0);    
    }
}

Причина вашей первоначальной проблемы в том, что бегун тестов не смог создать тестовый класс, поскольку он (бегун) не был собран дляdo DI.

Чтобы протестировать предметный класс, вам нужно было создать экземпляр класса и внедрить все зависимости, необходимые для проверки поведения тестируемого метода.

Там действительно былонет необходимости использовать контейнер для такого маленького изолированного теста

0 голосов
/ 15 ноября 2018

Вам не хватает атрибута [TestClass] в тестовом классе (предполагается, что вы используете MSTest Framework). Тестовые классы должны иметь пустой конструктор по умолчанию или вообще не иметь конструкторов.

Для настройки тестов вы можете организовать их так, как вы

  1. Вручную создайте необходимые экземпляры или
  2. Используйте насмешливый каркас или
  3. Выполните те же инициализации, что и в вашем приложении, относительно внедрения зависимостей, а затем разрешите экземпляры, как требуется.

Может быть, вы также захотите взглянуть на шаблон Arrange-Act-Assert для модульных тестов: (см. http://defragdev.com/blog/?p=783)

Также имейте в виду, что вы скорее хотите протестировать код, а не структуру DI.

...