2013-10-25 2 views
7

Chcę napisać test, który sprawdza klasy w danym obszarze nazw. Wszystkie metody tych klas, które zwracają jakąkolwiek listę, muszą być sprawdzone, jeśli zwrócą wartość null. Jeśli tak, test musi zakończyć się niepowodzeniem.Czy AutoFixture ma mechanizm sprawdzania, czy metody, które zwracają jakąkolwiek listę, nigdy nie zwracają wartości null?

Same klasy/metody mają również zależności (argumenty konstruktora i parametry metody), które powinny zostać zhomokowane.

Czy AutoFixture to mechanizm sprawdzający, czy metody, które zwracają jakąkolwiek listę, nigdy nie zwracają wartości null?

Przykład Klasa:

public class UserService 
{ 
    private readonly IRemotingFacade _remotingFacade; 

    public UserService(IRemotingFacade remotingFacade) 
    { 
     _remotingFacade = remotingFacade; 
    } 

    // directly return a list 
    public IEnumerable<User> GetUsers() 
    { 

    } 

    // directly return a list, pass method parameters 
    public IEnumerable<User> GetUsers(string filter) 
    { 

    } 

    // wrapped list 
    public IBusinessResponse<IEnumerable<User>> GetUsers() 
    { 

    } 


    // wrapped list, pass method parameters 
    public IBusinessResponse<IEnumerable<User>> GetUsers(string filter) 
    { 

    } 
} 

Więc proszę conider że lista może być owinięty w innym obiekcie.

+5

AutoFixture.Idioms obejmuje wiele tego rodzaju rzeczy. Nie jest to jeszcze udokumentowane, ale jak zwykle w przypadku jakichkolwiek materiałów @ploeh, jest ono objęte doskonałymi testami, więc spójrz na Scenariusze. Zgaduję, że jeszcze tego nie robi, ale def robi wiele rzeczy prawie tak samo. –

Odpowiedz

5

AutoFixture 3.18.0 wprowadza nową bibliotekę kleju o nazwie Idioms.FsCheck który wykorzystuje FsCheck do realizacji wielokrotnego użytku twierdzenie o nazwie ReturnValueMustNotBeNullAssertion.

Ten nowy asercja weryfikuje (a przynajmniej sprawia, że ​​jest prawdopodobne), że metoda zwracająca wartość (zapytanie) nie zwraca wartości null.

Instalacja

idiomów.FsCheck jest dostępny na Nuget:

PM> Install-Package AutoFixture.Idioms.FsCheck 

scenariusze

UserService wykorzystuje wstrzykuje wystąpienie IRemotingFacade i ukazuje dwa [1] zapytania:

  • użytkownika [] GetUsers ()
  • Użytkownik [] GetUsers (int)

Scenariusz 1: Wstrzykiwana wystąpienie IRemotingFacade zwraca null:

[Theory, UnitTestConventions] 
public void Scenario1(
    ISpecimenBuilder builder, 
    [Frozen]Mock<IRemotingFacade> stub) 
{ 
    stub.Setup(x => x.GetUsers()).Returns((User[])null); 

    var sut = from x in new Methods<UserService>() select x.GetUsers(); 

    var assertion = new ReturnValueMustNotBeNullAssertion(builder); 
    Assert.Throws<ReturnValueMustNotBeNullException>(() => 
     assertion.Verify(sut)); 
} 

Scenariusz 2: Wstrzykiwana instancja IRemotingFacade nie zwraca NULL:

[Theory, UnitTestConventions] 
public void Scenario2(
    ISpecimenBuilder builder, 
    [Frozen]Mock<IRemotingFacade> stub, 
    User[] users) 
{ 
    stub.Setup(x => x.GetUsers()).Returns(users); 

    var sut = from x in new Methods<UserService>() select x.GetUsers(); 

    var assertion = new ReturnValueMustNotBeNullAssertion(builder); 
    Assert.DoesNotThrow(() => assertion.Verify(sut)); 
} 

Scenariusz 3: Jeśli i to -1GetUsers(int) zwraca NULL:

[Theory, UnitTestConventions] 
public void Scenario3(
    ISpecimenBuilder builder, 
    [Frozen]Mock<IRemotingFacade> stub, 
    User[] users) 
{ 
    stub.Setup(x => x.GetUsers()).Returns(users); 

    var sut = from x in new Methods<UserService>() 
       select x.GetUsers(default(int)); 

    var assertion = new ReturnValueMustNotBeNullAssertion(builder); 
    Assert.Throws<ReturnValueMustNotBeNullException>(
     () => assertion.Verify(sut)); 
} 

Uwagi

If you only have F# 3.1 installed, można również dodać zespół wiążące przekierować w app.config plik:

<dependentAssembly> 
    <assemblyIdentity name="FSharp.Core" 
        publicKeyToken="b03f5f7f11d50a3a" 
        culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-4.3.1.0" 
        newVersion="4.3.1.0" /> 
</dependentAssembly> 

UnitTestConventionsAttribute jest zdefiniowany jako :

internal class UnitTestConventionsAttribute : AutoDataAttribute 
{ 
    internal UnitTestConventionsAttribute() 
     : base(new Fixture().Customize(new AutoMoqCustomization())) 
    { 
    } 
} 

Kwerendy odbicia są wykonywane przy użyciu Albedo.


[1] Dla demo, I uprościł original code jak poniżej:

public class User 
{ 
} 

public interface IRemotingFacade 
{ 
    User[] GetUsers(); 
} 

public class UserService 
{ 
    private readonly IRemotingFacade remotingFacade; 

    public UserService(IRemotingFacade remotingFacade) 
    { 
     if (remotingFacade == null) 
      throw new ArgumentNullException("remotingFacade"); 

     this.remotingFacade = remotingFacade; 
    } 

    public User[] GetUsers() 
    { 
     return this.remotingFacade.GetUsers(); 
    } 

    public User[] GetUsers(int i) 
    { 
     if (i == -1) 
      return null; 

     return this.remotingFacade.GetUsers(); 
    } 
} 
+0

Dla wszystkich, którzy chcą wypróbować ten kod, potrzebne są następujące pakiety: Albedo, AutoFixture, AutoFixture.AutoMoq, AutoFixture.Idioms, AutoFixture.Idioms.FsCheck, AutoFixture.Xunit, FsCheck, Moq, Moq.AutoMock, xunit, xunit.extensions – Rookian

+0

Jeśli odwołasz się do wyższych poziomów, pozostałe zależności zostaną automatycznie dodane przez NuGet. Chociaż piszę to z mojej głowy, powinny to być AutoFixture.Idioms.FsCheck, AutoFixture.Xunit i AutoFixture.AutoMoq. –

5

Powyższy komentarz Rubena Bartelinka jest poprawny. Niespodziewanie, AutoFixture.Idioms nie ma (jeszcze) mają ten konkretny test, chociaż pierwszy idiomatyczne badanie wprowadzone do tej biblioteki był jego odpowiednik na polecenia strony: GuardClauseAssertion

Myślę jednak, że to doskonały pomysł (i I don” wiesz dlaczego wcześniej o tym nie myślałem), więc dodałem teraz a new task to the backlog.

+0

Mam zaktualizowane moje pytanie. Chciałem tylko podać kilka przypadków użycia. – Rookian