Изначально AutoFixture создавался как инструмент для разработки через тестирование (TDD), а TDD — это обратная связь. В духе GOOS вам следует прислушиваться к своим тестам. Если тесты сложно писать, вам следует подумать о дизайне вашего API. AutoFixture имеет тенденцию усиливать такого рода отзывы.
Откровенно говоря, неизменяемые типы — это боль в C#, но вы можете упростить работу с таким классом, как Rsvp
, если возьмете пример из F# и введете семантику copy and update. Если вы измените Rsvp
таким образом, с ним будет намного проще работать в целом и, следовательно, как побочный продукт, также и для модульного тестирования:
public class Rsvp
{
public string Response { get; private set; }
public DateTime CreatedDate { get; private set; }
public Rsvp(string response, DateTime createdDate)
{
Response = response;
CreatedDate = createdDate;
}
public Rsvp WithResponse(string newResponse)
{
return new Rsvp(newResponse, this.CreatedDate);
}
public Rsvp WithCreatedDate(DateTime newCreatedDate)
{
return new Rsvp(this.Response, newCreatedDate);
}
}
Обратите внимание, что я добавил два метода WithXyz
, которые возвращают новый экземпляр с одним измененным значением, но все остальные значения остаются постоянными.
Это позволит вам создать экземпляр Rsvp
для тестирования следующим образом:
var fixture = new Fixture();
var seed = fixture.Create<Rsvp>();
var sut = seed.WithResponse("Attending");
или, как однострочный:
var sut = new Fixture().Create<Rsvp>().WithResponse("Attending");
Если вы не можете изменить Rsvp
, вы можете добавить методы WithXyz
в качестве методов расширения.
Как только вы сделаете это около дюжины раз, вам это надоест, и пришло время перейти на F #, где все это (и многое другое) встроено:
type Rsvp = {
Response : string
CreatedDate : DateTime }
Вы можете создать запись Rsvp
с AutoFixture следующим образом:
let fixture = Fixture()
let seed = fixture.Create<Rsvp>()
let sut = { seed with Response = "Attending" }
или, как однострочный:
let sut = { Fixture().Create<Rsvp>() with Response = "Attending" }
person
Mark Seemann
schedule
28.12.2013
Build<T>().FromFactory(Func<T> factory)
выдает InvalidCastException, когда я пытаюсь это сделать. Это все еще работает в AutoFixture 4.0? - person John Zabroski   schedule 13.12.2020