如何配置AutoFixture创建多个特定类型的时候使用一个枚举值作为种子?多个、种子、类型、时候

2023-09-04 13:20:04 作者:若隱若現要怎麼透

我有以下几种类型:

 公共枚举状态
{
    线上,
    当前离线
}

公共类用户
{
    私人只读状态_status;
    公众用户(状态状态){_status =地位; }
    公共状态状态{{返回_status; }}
    公共字符串名称{获取;集;}
}
 

现在,当执行 fixture.CreateMany<使用者> 我要AutoFixture返回两个用户,每STATUS 。所有其他属性 - 如名称 - 应该充满匿名数据

问: 如何配置AutoFixture做到这一点?

我尝试了以下内容:

注册收藏这个消息了用户目标:

  fixture.Register(
    ()=> 。Enum.GetValues​​(typeof运算(状态))演员LT;状态>()选择(S =>
        新用户()));
 

使用这种方法的问题是,AutoFixture不填写其他属性,如名称

自定义用户来使用工厂和注册使用 fixture.Create A系列:

  f.Customize<使用者>(C => c.FromFactory((状态S)=>新用户()));
    f.Register(()=>
        Enum.GetValues​​(typeof运算(状态))
            .Cast<状态>()
            。选择(S =>(用户)f.Create(新SeededRequest(typeof运算(用户),S),
                                        新SpecimenContext(F))));
 
Swift AutoClick Lite下载 Swift AutoClick Lite 自动点击器 v1.2 官方版下载

这也不能工作。种子不被使用。

解决方案

你可以这样做:

  VAR用户=新灯()创建<发电机<使用者>>();

VAR onlineUser = users.Where(U => u.Status == Status.Online)。首先();
VAR offlineUser = users.Where(U => u.Status == Status.Offline)。首先();
 

如果您使用的是AutoFixture.Xunit,声明当量为:

  [理论,数据研究机构Autodata]
公共无效CreateOneOfEachDeclaratively(发电机<使用者>用户)
{
    VAR onlineUser = users.Where(U => u.Status == Status.Online)。首先();
    VAR offlineUser = users.Where(U => u.Status == Status.Offline)。首先();

    //使用onlineUser和offlineUser这里...
}
 

I have the following types:

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

Now, when executing fixture.CreateMany<User> I want AutoFixture to return two Users, one per status. All other properties - like Name - should be filled with anonymous data.

Question: How to configure AutoFixture to do this?

I tried the following this:

Register collection that news up the User object:

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

The problem with this approach is that AutoFixture doesn't fill the other properties like Name

Customize User to use a factory and register a collection that uses 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))));

That didn't work either. The seed isn't being used.

解决方案

You could do this:

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();

If you're using AutoFixture.Xunit, the declarative equivalent is:

[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...
}