2016-04-19 2 views
3

У меня проблема, когда NUnit говорит мне: «Не найдено подходящего конструктора». Что вызывает это? Я также получаю другое сообщение: «Exception не имеет stacktrace». Оба сообщения повторяются снова и снова. Вот мой кодNunit test дает результат OneTimeSetUp: Не найдено подходящего конструктора

[TestFixture] 
public class SecurityServiceTests 
{ 
    private IContext stubIContext; 
    private ISecurityService securityService; 
    private IWindsorContainer windsorContainer; 

    public SecurityServiceTests(IContext stubIContext) 
    { 
     this.stubIContext= stubIContext; 
    } 

    [TestFixtureSetUp] 
    public void TestSetup() 
    { 
     //Mocks the database context 
     stubIContext= MockRepository.GenerateStub<IContext>(); 
     var returnedList = new List<string>(); 
     stubIContext.Stub(a => a.GetUserSecurities(null)).IgnoreArguments().Return(returnedList); 

     securityService = new SecurityService(windsorContainer); 

    } 

    [Test] 
    public void ControllerShouldGetUserGroupForCurrentUsers() 
    { 
     //Act 
     var action = securityService.CurrentUserFeatureList; 

     //Assert 
     Assert.IsNotNull(action); 
    } 


} 

ответ

3

Ваш SecurityServiceTests класс должен иметь конструктор по умолчанию, который будет использоваться в качестве TextFixture.

От docs on TextFixture:

Есть несколько ограничений на класс, который используется в качестве испытательного стенда.

Он должен быть общедоступным, или NUnit его не увидит.

У него должен быть конструктор по умолчанию, или NUnit не сможет его построить.

Это не так ясно, почему у вас есть конструктор в этом классе, который принимает и устанавливает IContext stubIContext, как вы потом издеваться, что поле в настройках.

Удалить конструктор public SecurityServiceTests(IContext stubIContext) и испытания будут выполнены.

Edit: это slightly different in NUnit3, как отметил в @ Крис комментариев:

Если аргументы не обеспечиваются TestFixtureAttribute, класс должен иметь конструктор по умолчанию.

Если аргументы предоставлены, они должны соответствовать одному из конструкторов.

+0

Просто отметьте, что в NUnit3 можно параметризовать TestFixtures. Но вы правы, это не похоже на то, что здесь нужно. [v3 Docs] (https://github.com/nunit/docs/wiki/TestFixture-Attribute) – Chris

4

Вы пытаетесь создать параметризованное приспособление, поэтому у вас есть конструктор, принимающий один аргумент. В отличие от вышеприведенного комментария это справедливо как для NUnit V2, так и для V3.

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

[TestFixture(someArgument)] 

Возможно, вы намерены делать что-то подобное путем присвоения значения stubIContext в TestFixtureSetUp. Тем не менее, это не может работать по двум причинам:

  1. Это не подается в конструктор и где ваш светильник нуждается.

  2. В любом случае, строительство объекта происходит до вызова метода настройки.

Существует несколько способов получить заглушку, созданную до создания экземпляра, особенно в NUnit v3. Тем не менее, я не понимаю, почему вам нужно, чтобы этот прибор был параметризирован, так как вы все равно используете заглушку.

Если у вас нет необходимости в параметризации, не показанной в примере, я бы просто создал заглушку в настройке.Мое предпочтение было бы в использовании SetUp, а не TestFixtureSetUp. Создание заглушек не дорого, поэтому, по-видимому, нет причин для экономии. Однако, если есть причины, не замеченные в выдержке, TestFixtureSetUp также может работать.

Смежные вопросы