2016-05-30 3 views
1

Использование Autofixture 3.46 Атрибут AutoData из Autofixture.xUnit2 3.46 и xunit2, создающий экземпляр Sum в параметре метода тестирования, я получаю Xunit.sdk.EqualException из утверждения.Почему у нас есть неполная реализация типов из параметра метода тестирования - AutoFixture с AutoData

[Theory ] 
[AutoData] 
public void ShouldBeSum_AutoData(int a, int b, Sum uut) 
{ 

    //problem 
    int residue = uut.Value; //not zero! 
    //fix 
    uut.Value = 0; 

    //Arrange - in the parameter leads to problem 
    // var uut =new Sum(); 

    //Act 
    uut.Add(a); 
    uut.Add(b); 

    //Assert 
    Assert.Equal(a + b, uut.Value); 

} 

кажется значение свойства нового экземпляра Sum не установлен по умолчанию для данного типа (скажем ноль) на instantiation- доказательств в ненулевое значение «остатка».

public class Sum 
{ 
    public int Value { get; set; } 

    public void Add(int number) 
    { 
     Value += number; 
    } 
} 

Активация тестовой цели uut из тела (и с новым) дает ожидаемые значения начальных значений по умолчанию. Таким образом, класс uut не полностью создан из параметра в настоящее время - это ваша ответственность.

Затруднительное положение по дороге?

ответ

2

Это поведение по дизайну. AutoFixture предназначен для создания и заполнения данных в объекты, так что это по умолчанию.

Есть много способов, которыми можно отключить AutoProperties в AutoFixture. В этом конкретном примере, самый легкий исправление, чтобы применить атрибут [NoAutoProperties] к uut аргумента:

[Theory, AutoData] 
public void ShouldBeSum_AutoData(int a, int b, [NoAutoProperties]Sum uut) 
{ 
    uut.Add(a); 
    uut.Add(b); 

    Assert.Equal(a + b, uut.Value); // Passes 
} 

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


Наконец, это должно дать паузу, чтобы подумать о дизайне Sum: это уместно, что Value является публичным изменяемой собственностью? Не должны ли инварианты класса SumValueгарантировать, что является результатом выполнения расчетов с классом (то есть путем вызова Add)?

Такая конструкция может выглядеть следующим образом:

public class Summer 
{ 
    public int Value { get; private set; } 

    public void Add(int number) 
    { 
     Value += number; 
    } 
} 

в этом случае следующий тест автоматически переходит:

[Theory, AutoData] 
public void ShouldBeSum_AutoData(int a, int b, Summer uut) 
{ 
    uut.Add(a); 
    uut.Add(b); 

    Assert.Equal(a + b, uut.Value); // Passes 
} 

AutoFixture был первоначально построен как инструмент для испытаний Driven Development (TDD) , и TDD - все о обратная связь. В духе GOOS вы должны послушать ваши тесты. Если тесты трудно писать, вы должны рассмотреть свой дизайн API. AutoFixture имеет тенденцию усиливать такую ​​обратную связь, поэтому хорошая реакция на проблему с AutoFixture - это посмотреть на SUT, прежде чем смотреть на AutoFixture.

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