8

私は次のタイプを持っています:

public enum Status
{
    Online,
    Offline
}

public class User
{
    private readonly Status _status;
    public User(Status status) { _status = status; }
    public Status Status {get {return _status; }}
    public string Name {get;set;}
}

ここで、実行fixture.CreateMany<User>時に AutoFixture がUsersステータスごとに 1 つずつ、2 つの を返すようにします。他のすべてのプロパティ (などName) には、匿名データを入力する必要があります。

質問:
これを行うために AutoFixture を構成するにはどうすればよいですか?


私はこれを次のように試しました:

  1. オブジェクトを更新するコレクションを登録しUserます。

    fixture.Register(
        () => Enum.GetValues(typeof(Status)).Cast<Status>().Select(s => 
            new User(s)));
    

    このアプローチの問題は、AutoFixture が次のような他のプロパティを埋めないことです。Name

  2. ファクトリを使用するようにカスタマイズし、次Userを使用するコレクションを登録しますfixture.Create

        f.Customize<User>(c => c.FromFactory((Status s) => new User(s)));
        f.Register(() =>
            Enum.GetValues(typeof(Status))
                .Cast<Status>()
                .Select(s => (User)f.Create(new SeededRequest(typeof(User), s),
                                            new SpecimenContext(f))));
    

    それもうまくいきませんでした。種子は使用されていません。

4

4 に答える 4

5

あなたはこれを行うことができます:

var users = new Fixture().Create<Generator<User>>();

var onlineUser = users.Where(u => u.Status == Status.Online).First();
var offlineUser = users.Where(u => u.Status == Status.Offline).First();

AutoFixture.Xunit を使用している場合、同等の宣言は次のとおりです。

[Theory, AutoData]
public void CreateOneOfEachDeclaratively(Generator<User> users)
{
    var onlineUser = users.Where(u => u.Status == Status.Online).First();
    var offlineUser = users.Where(u => u.Status == Status.Offline).First();

    // Use onlineUser and offlineUser here...
}
于 2013-06-18T13:23:10.543 に答える
5

次のようなカスタマイズを宣言して使用できますStatusGenerator

var fixture = new Fixture();
fixture.RepeatCount = 2;
fixture.Customizations.Add(new StatusGenerator());

var result = fixture.CreateMany<User>();

仮想的な実装はStatusGenerator次のようになります。

internal class StatusGenerator : ISpecimenBuilder
{
    private readonly Status[] values;
    private int i;

    internal StatusGenerator()
    {
        this.values =
            Enum.GetValues(typeof(Status)).Cast<Status>().ToArray();
    }

    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as ParameterInfo;
        if (pi == null || !pi.ParameterType.IsEnum)
            return new NoSpecimen(request);

        return this.values[i == this.values.Length - 1 ? i = 0 : ++i];
    }
}
于 2013-06-14T20:52:30.663 に答える