9

次のエンティティがあるとします。

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public Guid UserGuid { get; set; }
    public Guid ConfirmationGuid { get; set; }
}

そして、次のインターフェースメソッド:

void CreateUser(string username);

実装の一部で、2 つの新しい GUID を作成する必要があります。1 つは 用UserGuid、もう 1 つは 用ConfirmationGuidです。値を に設定して、これを行う必要がありますGuid.NewGuid()

インターフェイスを使用して既に Guid.NewGuid() を抽象化しています。

public interface IGuidService
{
    Guid NewGuid();
}

したがって、必要な新しい GUID が 1 つだけの場合は、これを簡単にモックできます。しかし、1 つのメソッド内から同じメソッドへの 2 つの異なる呼び出しをモックして、異なる値を返す方法がわかりません。

4

2 に答える 2

11

Moq を使用している場合は、以下を使用できます。

mockGuidService.SetupSequence(gs => gs.NewGuid())
    .Returns( ...some value here...)
    .Returns( ...another value here... );

次のこともできると思います。

mockGuidService.Setup(gs => gs.NewGuid())
    .Returns(() => ...compute a value here...);

それでも、戻り関数内でランダムな値を提供するだけでない限り、順序に関する知識は依然として重要なようです。

于 2012-07-21T04:06:22.217 に答える
4

@Mattの例のようにMoqを使用できない場合は、基本的に同じことを行う独自のクラスを作成できます。

public class GuidSequenceMocker
{
    private readonly IList<Guid> _guidSequence = new[]
                                                     {
                                                         new Guid("{CF0A8C1C-F2D0-41A1-A12C-53D9BE513A1C}"),
                                                         new Guid("{75CC87A6-EF71-491C-BECE-CA3C5FE1DB94}"),
                                                         new Guid("{E471131F-60C0-46F6-A980-11A37BE97473}"),
                                                         new Guid("{48D9AEA3-FDF6-46EE-A0D7-DFCC64D7FCEC}"),
                                                         new Guid("{219BEE77-DD22-4116-B862-9A905C400FEB}") 
                                                     };
    private int _counter = -1;

    public Guid Next()
    {
        _counter++;

        // add in logic here to avoid IndexOutOfRangeException
        return _guidSequence[_counter];
    }
}
于 2012-07-21T04:16:48.213 に答える