C# 在这种情况下如何使用AutoFixture?

C# 在这种情况下如何使用AutoFixture?,c#,autofixture,C#,Autofixture,我有以下代码: var boundArgument = new BoundArgumentOption { PatientId = patientId }; var mockRepositoryFactory = A.Fake<IRepositoryFactory>(); var sut = new HtmlOutputBuilder(mockRepositoryFactory); var patientRecord = // Some record; var moc

我有以下代码:

var boundArgument = new BoundArgumentOption
{
    PatientId = patientId
};

var mockRepositoryFactory = A.Fake<IRepositoryFactory>();

var sut = new HtmlOutputBuilder(mockRepositoryFactory);

var patientRecord = // Some record;

var mockRepository = A.Fake<IRepository>();
A.CallTo(() => mockRepository.Get(boundArgument)).Returns(patientRecord);
A.CallTo(() => mockRepositoryFactory.Create(boundArgument)).Returns(mockRepository);

string actualResult = sut.BuildReport(boundArgument);

actualResult.Should().Be(expectedHtmlContent);
var boundArgument=new BoundArgumentOption
{
PatientId=PatientId
};
var mockRepositoryFactory=A.Fake();
var sut=新的HtmlOutputBuilder(mockRepositoryFactory);
var patientRecord=//一些记录;
var mockRepository=A.Fake();
A.CallTo(()=>mockRepository.Get(boundArgument)).Returns(patientRecord);
A.CallTo(()=>mockRepositoryFactory.Create(boundArgument)).Returns(mockRepository);
字符串actualResult=sut.BuildReport(boundArgument);
actualResult.Should().Be(expectedHtmlContent);
这就通过了测试

然后,我尝试使用AutoFixture,如下所示:

var fixture = new Fixture().Customize(new AutoFakeItEasyCustomization());

var boundArgument = fixture.Create<BoundArgumentOption>();

var mockRepositoryFactory = A.Fake<IRepositoryFactory>();

fixture.Freeze(mockRepositoryFactory);

var sut = fixture.Create<HtmlOutputBuilder>();

var patientRecord = //Some record;

boundArgument.PatientId = patientId;

var mockRepository = A.Fake<IRepository>();
A.CallTo(() => mockRepository.Get(boundArgument)).Returns(patientRecord);

A.CallTo(() => mockRepositoryFactory.Create(boundArgument)).Returns(mockRepository);

string actualResult = sut.BuildReport(boundArgument);

actualResult.Should().Be(expectedHtmlContent);
var fixture=newfixture().Customize(new AutoFakeItEasyCustomization());
var boundArgument=fixture.Create();
var mockRepositoryFactory=A.Fake();
夹具冻结(模拟存储工厂);
var sut=fixture.Create();
var patientRecord=//一些记录;
boundArgument.PatientId=PatientId;
var mockRepository=A.Fake();
A.CallTo(()=>mockRepository.Get(boundArgument)).Returns(patientRecord);
A.CallTo(()=>mockRepositoryFactory.Create(boundArgument)).Returns(mockRepository);
字符串actualResult=sut.BuildReport(boundArgument);
actualResult.Should().Be(expectedHtmlContent);
它失败了。特别是,第二个实例中的
patientRecord
没有正确填充


我做错了什么?

注意:我无法编译您提供的测试。。然而,似乎你所要做的就是:

fixture.Inject(mockRepositoryFactory);
您可以尝试以下方法:

[Fact]
public void TestWithAutoFixtureImperatively()
{
    // Fixture setup
    var fixture = new Fixture()
        .Customize(new AutoFakeItEasyCustomization());

    var expectedRecord = fixture.Create<string>();
    var boundArgOption = fixture.Create<BoundArgumentOption>();

    var repositoryStub = A.Fake<IRepository>();
    A.CallTo(() => 
        repositoryStub
            .Get(boundArgOption))
            .Returns(expectedRecord);

    var repositoryFactoryStub = A.Fake<IRepositoryFactory>();
    A.CallTo(() => 
        repositoryFactoryStub
            .Create(boundArgOption))
            .Returns(repositoryStub);

    fixture.Inject(repositoryFactoryStub);

    var sut = fixture.Create<HtmlOutputBuilder>();

    // Exercise system
    string result = sut.BuildReport(boundArgOption);

    // Verify outcome
    result.Should().Be(expectedRecord);

    // Teardown
}
AutoDomainDataAttribute
定义为:

internal class AutoDomainDataAttribute : CompositeDataAttribute
{
    internal AutoDomainDataAttribute()
        : base(
            new AutoDataAttribute(
                new Fixture().Customize(
                    new AutoFakeItEasyCustomization())))
    {
    }
}

注意:我无法编译您提供的测试。。然而,似乎你所要做的就是:

fixture.Inject(mockRepositoryFactory);
您可以尝试以下方法:

[Fact]
public void TestWithAutoFixtureImperatively()
{
    // Fixture setup
    var fixture = new Fixture()
        .Customize(new AutoFakeItEasyCustomization());

    var expectedRecord = fixture.Create<string>();
    var boundArgOption = fixture.Create<BoundArgumentOption>();

    var repositoryStub = A.Fake<IRepository>();
    A.CallTo(() => 
        repositoryStub
            .Get(boundArgOption))
            .Returns(expectedRecord);

    var repositoryFactoryStub = A.Fake<IRepositoryFactory>();
    A.CallTo(() => 
        repositoryFactoryStub
            .Create(boundArgOption))
            .Returns(repositoryStub);

    fixture.Inject(repositoryFactoryStub);

    var sut = fixture.Create<HtmlOutputBuilder>();

    // Exercise system
    string result = sut.BuildReport(boundArgOption);

    // Verify outcome
    result.Should().Be(expectedRecord);

    // Teardown
}
AutoDomainDataAttribute
定义为:

internal class AutoDomainDataAttribute : CompositeDataAttribute
{
    internal AutoDomainDataAttribute()
        : base(
            new AutoDataAttribute(
                new Fixture().Customize(
                    new AutoFakeItEasyCustomization())))
    {
    }
}

expectedHtmlContent
的值是多少?@NikosBaxevanis它不应该真的在乎
expectedHmtlContent
的值是多少,但仅供参考,它实际上是一个Html字符串,我将写入一个文件。
expectedHtmlContent
的值是多少?@NikosBaxevanis它不应该真的在乎
expectedHmtlContent
仅供参考,它实际上是一个Html字符串,我将写入一个文件。提供的代码不可编译:)。我想去掉绒毛。已经说过,提供的代码是有效的:)。非常感谢你。我在任何地方都没有看到过详细的注入方法。有什么地方可以让我找到更多的信息吗?注射和冷冻有什么区别?这应该是一个单独的问题吗?不客气<代码>注入自定义
夹具
实例,以始终返回相同的注入值
Freeze
将为您创建值,然后它在内部调用
Inject
。有关
Inject
工作方式的详细信息,请参阅提供的代码,该代码不可编译:)。我想去掉绒毛。已经说过,提供的代码是有效的:)。非常感谢你。我在任何地方都没有看到过详细的注入方法。有什么地方可以让我找到更多的信息吗?注射和冷冻有什么区别?这应该是一个单独的问题吗?不客气<代码>注入自定义
夹具
实例,以始终返回相同的注入值
Freeze
将为您创建值,然后在内部调用
Inject
。有关
Inject
工作原理的详细信息,请访问