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();
}
}
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. –