2016-08-01 5 views
2

Это мой кодблок тестирования тела свойств

public class AssistanceRequest : DocumentBase 
{ 
    public AssistanceRequest() 
    { 
     RequestTime = DateTime.Now; 
     ExcecutionTime = DateTime.MaxValue; 
    } 

    public AssistanceRequest(int amount, string description, DateTime? requestTime) : this() 
    { 
     //Check for basic validations 
     if (amount <= 0) 
      throw new Exception("Amount is not Valid"); 
     this.Amount = amount; 
     this.Description = description; 
     this.RequestTime = requestTime ?? DateTime.Now; 
    } 

    private long Amount { get; set; } 

    private DateTime requestTime { get; set; } 

    public DateTime RequestTime 
    { 
     get { return requestTime; } 
     set 
     { 
      if (value != null && value < DateTime.Now) 
       throw new Exception("Request Time is not Allowed"); 
      requestTime = value; 
     } 
    } 

Как вы можете видеть, у меня есть подтверждение в моем Set тела. Мне нужно проверить это. , и я пытаюсь вызвать конструктора в своих тестах. но я получаю исключение в конструкторе (поступок) перед утверждением. Как сделать мои тесты правильными?

Это мой тест:

[Theory] 
    [MemberData("RequestFakeData")] 
    public void Should_Throw_Exception_RequestDate(int amount, string description, DateTime requestDate) 
    { 
     var manager = new AssistanceRequest(amount,description,requestDate); 
     manager.Invoking(x => x.SomeMethodToChangeRequestTime).ShouldThrowExactly<Exception>() 
    } 

    public static IEnumerable<object[]> RequestFakeData 
    { 
     get 
     { 
      // Or this could read from a file. :) 
      return new[] 
      { 
      new object[] { 0,string.Empty,DateTime.Now.AddDays(1) }, 
      new object[] { 2,"",DateTime.Now.AddDays(-2) }, 
      new object[] { -1,string.Empty,DateTime.Now.AddDays(-3) }, 
      }; 
     } 
    } 

Я получаю ошибку в об этой линии:

var manager = new AssistanceRequest(amount,description,requestDate); 

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

Мой вопрос: как я могу проверить это без изменения моего конструктора?

ответ

5

Я нашел решение и для тех, кто проверить позже я поставил его прямо здесь.

Если мы хотим протестировать эти типы исключений в xUnit, это может стать немного сложнее.

Я прочитал статью здесь: http://hadihariri.com/2008/10/17/testing-exceptions-with-xunit/

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

Я изменил мои тесты, как это:

[Theory] 
    [MemberData("RequestFakeData")] 
    public void Should_Throw_Exception_RequestDate(int amount, string description, DateTime requestDate) 
    { 
     Exception ex = Assert.Throws<Exception>(() => new AssistanceRequest(amount,description,requestDate)); 
     Assert.Equal("Request Time is not Allowed",ex.Message); 
    } 

    public static IEnumerable<object[]> RequestFakeData 
    { 
     get 
     { 
      return new[] 
      { 
      new object[] { 1,string.Empty,DateTime.Now }, 
      new object[] { 2,"",DateTime.Now.AddDays(-2) }, 
      new object[] { 1,string.Empty,DateTime.Now.AddDays(-3) }, 
      }; 
     } 
    } 

надеюсь, что это будет полезно.

+0

Почему вы тестируете конструктор вместо свойства, как было задано в вопросе? Вы можете создать экземпляр без конструктора без параметров и проверить свойство –

2

Я не знаком с синтаксисом XUnit, но я думаю, вам нужно удалить строку «manager.Invoking», так как исключение будет выбрано в строке выше, а затем заменит его атрибутом ExpectedException на самом тесте.

Что-то вроде:

[ExpectedException(typeof(Exception))] 
[MemberData("RequestFakeData")] 
public void Should_Throw_Exception_RequestDate...... 

Кроме того, я бы рекомендовал переключения Exception для ArgumentException.

Редактировать: Я не могу быть уверен, что приведенный ниже синтаксис верен в инструкции лямбда, но это должно быть хорошим началом.

[MemberData("RequestFakeData")] 
public void Should_Throw_Exception_RequestDate(int amount, string description, DateTime requestDate) 
{ 
    Exception ex = Assert.Throws<Exception>(() => new AssistanceRequest(amount,description,requestDate)); 

    Assert.Equal("Request Time is not Allowed", ex.Message) 
} 

Я экстраполировать этот ответ от: http://hadihariri.com/2008/10/17/testing-exceptions-with-xunit/

+1

Спасибо за ответ, я ищу что-то подобное в xUnit, но до сих пор ничего не получил. Он просто работает для тестов VisualStudio. а не xUnit. – MRebati

+0

Извинения, мое собственное невежество на XUnit показывая там. Дайте мне знать, если что-то изменит. – Lee

+1

Большое вам спасибо. Потому что это заставило меня задуматься о моей ошибке и помогло мне решить ее по-другому. – MRebati