我有以下几种类型:
公共枚举状态
{
线上,
当前离线
}
公共类用户
{
私人只读状态_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))));
这也不能工作。种子不被使用。
解决方案你可以这样做:
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...
}