如何配置AutoFixture创建多个特定类型的时候使用一个枚举值作为种子? [英] How to configure AutoFixture to use an enum value as seed when creating many of a certain type?

查看:167
本文介绍了如何配置AutoFixture创建多个特定类型的时候使用一个枚举值作为种子?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下几种类型:

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

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

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

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


我尝试了以下内容:

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

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

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

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

      f.Customize<使用者>(C => c.FromFactory((状态S)=>新用户()));
        f.Register(()=>
            Enum.GetValues​​(typeof运算(状态))
                .Cast<状态>()
                。选择(S =>(用户)f.Create(新SeededRequest(typeof运算(用户),S),
                                            新SpecimenContext(F))));
     

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

解决方案

你可以这样做:

  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:

  1. 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

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

这篇关于如何配置AutoFixture创建多个特定类型的时候使用一个枚举值作为种子?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆