2015-04-04 4 views
1

Я использую moq с nunit, и мой тест не дает мне провала или прохода. Он говорит, что у него нет конструктора по умолчанию. Я подозреваю, что не делаю что-то правильно, вводя свой интерфейс в конструктор.DonorManagementTests не имеет конструктора по умолчанию (nunit/moq)

DonorManagementTests

[TestFixture] 
public class DonorManagementTests 
{ 
    private readonly Mock<IValidation> _mockValidation; 
    private readonly DonorManagement _donorManagement; 

    public DonorManagementTests(IValidation validation) 
    { 
     _mockValidation = new Mock<IValidation>(); 
     _donorManagement = new DonorManagement(_mockValidation.Object); 

    } 

    [Test, Description("View correct gift aid to two decimal places")] 
    public void DonorViewGiftAid() 
    { 
     const int donation = 20; 
     _mockValidation.Setup(x => x.ValidateDonation(donation)).Returns(20.00m); 
     var res = _donorManagement.GiftAidAmount(donation); 
     Assert.IsInstanceOf(typeof (decimal), res); 
     _mockValidation.Verify(x => x.ValidateDonation(donation), Times.Once); 
    } 
} 

DonorManagement

public class DonorManagement : IDonor 
{ 
    private readonly IValidation _validation; 

    public DonorManagement(IValidation validation) 
    { 
     _validation = validation; 
    } 

    public virtual decimal GiftAidAmount(decimal donationAmount) 
    { 
     const decimal gaRatio = 17.5m/(100 - 17.5m); 
     return _validation.ValidateDonation(donationAmount) * gaRatio; 
    } 
} 

Любые идеи, что мне нужно изменить в своем коде?

+1

Ваш конструктор 'DonorManagementTests' даже не использует свой параметр. Вы можете удалить его, 'public DonorManagementTests() {...}'. Однако, если вы добавляете больше тестов в один класс, имейте в виду, что сказал Old Fox в своем ответе: когда многие тесты запускаются вместе, конструктор экземпляра работает только один раз. С другой стороны, метод с атрибутом '[SetUp]' будет запускаться перед каждым тестом. –

ответ

4

ваш тестовый класс должен иметь значение по умолчанию C'tor.

изменить тестовый класс:

[TestFixture] 
public class DonorManagementTests 
{ 
    private Mock<IValidation> _mockValidation; 
    private DonorManagement _donorManagement; 

    [SetUp] 
    public TestInit() 
    { 
     _mockValidation = new Mock<IValidation>(); 
     _donorManagement = new DonorManagement(_mockValidation.Object); 

    } 

    [Test, Description("View correct gift aid to two decimal places")] 
    public void DonorViewGiftAid() 
    { 
     const int donation = 20; 
     _mockValidation.Setup(x => x.ValidateDonation(donation)).Returns(20.00m); 
     var res = _donorManagement.GiftAidAmount(donation); 
     Assert.IsInstanceOf(typeof (decimal), res); 
     _mockValidation.Verify(x => x.ValidateDonation(donation), Times.Once); 
    } 
} 

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

+0

Добавление метода установки - это то, что мне нужно. Благодарю. –

1

NUnit документация (http://www.nunit.org/index.php?p=testFixture&r=2.5) говорит:

  • непараметризированным прибор должен иметь конструктор по умолчанию.
  • Параметрированный прибор должен иметь конструктор, соответствующий заданным параметрам.
Смежные вопросы