7

特定の名前空間内のクラスをチェックするテストを作成したいと考えています。あらゆる種類のリストを返すそのクラスのすべてのメソッドは、それらが null を返すかどうかをチェックする必要があります。もしそうなら、テストは失敗しなければなりません。

クラス/メソッド自体にも依存関係 (コンストラクターの引数とメソッドのパラメーター) があり、自動モック化する必要があります。

AutoFixture には、あらゆる種類のリストを返すメソッドが決して null を返さないことをチェックするメカニズムがありますか?

クラスの例:

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)
    {

    }
}

そのため、リストを別のオブジェクトでラップできることを考慮してください。

4

2 に答える 2

5

AutoFixture 3.18.0 では、Idioms.FsCheck という名前の新しいグルー ライブラリが導入されました。これは、FsCheck使用して という名前の再利用可能なアサーションを実装します。ReturnValueMustNotBeNullAssertion

この新しいアサーションは、値を返すメソッド (Query) が null を返さないことを検証します (または、少なくともその可能性を高めます)。

インストール

Idioms.FsCheck は NuGet で利用できます。

PM> Install-Package AutoFixture.Idioms.FsCheck

シナリオ

UserService注入された のインスタンスを使用し、 2 つの[1]クエリIRemotingFacadeを公開します。

  • ユーザー[] GetUsers()
  • ユーザー[] GetUsers(int)

シナリオ 1 : 注入された のインスタンスIRemotingFacadeが 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));
}

シナリオ 2 : 挿入された のインスタンスがIRemotingFacadenull を返さない:

[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));
}

シナリオ 3 : -1iがnull を返す場合: GetUsers(int)

[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));
}

備考

F# 3.1 しかインストールされていない場合は、 app.configファイルにアセンブリ バインディング リダイレクトを追加することもできます。

<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ように定義されます。

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

リフレクション クエリはAlbedoで実行されます。


[1]デモ用に、元のコードを次のように単純化しました。

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();
    }
}
于 2014-03-24T15:58:38.553 に答える
5

上記のRuben Bartelinkのコメントは正しいです。驚くべきことに、AutoFixture.Idiomsには (まだ) その特定のテストがありませんが、そのライブラリに導入された最初の慣用的なテストは、コマンド側で同等のものでした: GuardClauseAssertion

しかし、それは素晴らしいアイデアだと思います (そして、なぜ以前にそれを考えなかったのかわかりません) ので、新しいタスクをバックログに追加しました。

于 2013-10-25T11:00:41.130 に答える