使用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
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 = "我们自己的字符串";
fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior());