【问题标题】:Why doesn't Autofixture Likeness behave like I'd expect for one of these two tests?为什么 Autofixture Likeness 的行为不像我对这两个测试之一所期望的那样?
【发布时间】:2013-03-24 23:10:50
【问题描述】:

鉴于这些类:

public class DrumAndBassBand
{
    public Drums Drum { get; set; }
    public Bass Bass { get; set; }
}

public class Instrument
{
    public string Name { get; set; }
    public int SerialNumber { get; set; }
}
public class Drums : Instrument { }
public class Bass : Instrument { }

为什么这个测试通过了...

[Fact]
public void DrumAndBassBand_Equality_Behaves_As_Expected_Version_One()
{
    // arrange
    var template = new Fixture().Create<DrumAndBassBand>();

    // act
    var createdBand = new DrumAndBassBand {Drum = template.Drum, Bass = template.Bass};

    // assert         
    var createdLikeness = createdBand.AsSource().OfLikeness<DrumAndBassBand>()
        .Without(x => x.Bass)
        .CreateProxy();
    createdLikeness.Drum = createdBand.Drum;

    Assert.True(createdLikeness.Equals(template));

    var templateLikeness = template.AsSource().OfLikeness<DrumAndBassBand>()
        .Without(x => x.Bass)
        .CreateProxy();
    templateLikeness.Drum = template.Drum;

    Assert.True(templateLikeness.Equals(createdBand));
}

...这个失败了? (区别在于DrumAndBaseBand 实例化)

[Fact]
public void DrumAndBassBand_Equality_Behaves_As_Expected_Version_Two()
{
    // arrange
    var template = new Fixture().Create<DrumAndBassBand>();

    // act
    var createdBand =
        new DrumAndBassBand
        {
            Drum = new Drums { Name = template.Drum.Name, SerialNumber = template.Drum.SerialNumber },
            Bass = new Bass { Name = template.Bass.Name, SerialNumber = template.Bass.SerialNumber }
        };

    // assert
    var createdLikeness = createdBand.AsSource().OfLikeness<DrumAndBassBand>()
        .Without(x => x.Bass)
        .CreateProxy();
    createdLikeness.Drum = createdBand.Drum;

    Assert.True(createdLikeness.Equals(template));

    var templateLikeness = template.AsSource().OfLikeness<DrumAndBassBand>()
        .Without(x => x.Bass)
        .CreateProxy();
    templateLikeness.Drum = template.Drum;

    Assert.True(templateLikeness.Equals(createdBand));
}

【问题讨论】:

  • 从 3.0.4 及更高版本开始,值会自动复制到代理实例(这意味着,createdLikeness.Drum = createdBand.Drum; 将自动发生)。
  • 干得好,先生。干得好,确实。

标签: autofixture semantic-comparison


【解决方案1】:

在第二个测试中,DrumBass 实例与您尝试比较的模板不同。

您始终可以运行Likeness(无需创建代理)并检查输出:

Test 'DrumAndBassBand_Equality_Behaves_As_Expected_Version_Two' failed: 

Ploeh.SemanticComparison.LikenessException:
    The provided value DrumAndBassBand did not match the expected value DrumAndBassBand. 

The following members did not match: 
- Drum.

这基本上意味着您必须在创建Likeness 以比较Drum 实例时提供提示。

测试的前半部分变成:

var createdLikeness = createdBand
    .AsSource().OfLikeness<DrumAndBassBand>()
    .With(x => x.Drum)
        .EqualsWhen((s, d) => s.Drum == createdBand.Drum)
    .Without(x => x.Bass)
    .CreateProxy();

源目的地的Drums 等于其他 Drums,当它真的是一个createdBand 实例Drum

同样,测试的后半部分变成:

var templateLikeness = template
    .AsSource().OfLikeness<DrumAndBassBand>()
    .With(x => x.Drum)
        .EqualsWhen((s, d) => s.Drum == template.Drum)
    .Without(x => x.Bass)
    .CreateProxy();

以上允许您进行非常灵活的比较(并且您始终可以进一步自定义)。

【讨论】:

  • 谢谢,Nikos - 成功了。到目前为止,我还没有看到使用 With().EqualsWhen() 有什么好处,所以这很棒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多