c# – 如何配置AutoFixture以在创建某种类型时使用枚举值作为种子?

我有以下类型:
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返回两个用户,每个状态一个.所有其他属性 – 如Name – 应填充匿名数据.

题:
如何配置AutoFixture来执行此操作?

我尝试了以下这个:

>注册用户对象的新闻集合:

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

这种方法的问题是AutoFixture不会填充其他属性,如Name
>自定义用户使用工厂并注册使用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))));

那也行不通.种子没有被使用.

解决方法

你可以这样做:
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...
}

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么