AutoFixture 介绍

使用AutoFixture我们可以方便的给一些实体类自动赋上合适的属性值。

需要引用的包是 Ploeh.AutoFixture

前面在Mock dbcontext的时候有一个测试是下面这个样子的。

 [Fact]
public async Task Add_Should_Add_Entity_Into_Db()
{
    var (db, dbFunc) = DbContextHelper.Get();
    var service = new StudentService(db);
    var student = new Student()
    {
        Id = 1,
        Birthday = DateTime.Now,
        Name = "test1"
    };
    await service.Add(student);

    dbFunc().Students.Count().Should().Be(1);
    dbFunc().Students.FirstOrDefault().Should().BeEquivalentTo(student);
}

我们可以把它改成如下这个样子

[Fact]
public async Task Add_Should_Add_Entity_Into_Db()
{
    var fixture = new Fixture();
    var (db, dbFunc) = DbContextHelper.Get();
    var service = new StudentService(db);
    var student = fixture.Create<Student>();//这边可以帮我们自动创建 student实例 并且所有的属性会自动赋值

    await service.Add(student);

    dbFunc().Students.Count().Should().Be(1);
    dbFunc().Students.FirstOrDefault().Should().BeEquivalentTo(student);
}

var student = fixture.Create(); 这边可以帮我们自动创建 student实例 并且所有的属性会自动赋上合适的值。

某些属性要自己赋值

var student = fixture.Build<Student>().With(x => x.Id, 1).Create();

上面的代码我们就可以把 id的值固定1

某些属性不赋值。

有时候一些属性虽然是string类型,但它实际上存储的是Json,如果让fixture帮我们来生成这个值,可能就不合适了,所以我们忽略掉它。

var phoneBook = fixture.Build<PhoneBook>().Without(p => p.AllContacts).Create();
phoneBook.AllContacts = "我们自己的字符串";

AutoFixture 移除循环引用

fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
最近更新的
...