2017-06-12 71 views
2

我剛剛注意到,只要我在Build<>()-Create()之間的夾具上做Freeze調用Freeze s沒有得到應用。它是否打算AutoFixture的行爲或錯誤?AutoFixture建立凍結創建序列

爲了把事情說清楚:

var fixture = new Fixture().Customize(new AutoMoqCustomization()) 
var builder = fixture.Build<SomeType>(); 
fixture.Freeze<Mock<ISomeInterface>>().Setup(m => m.SomeProperty).Returns(10); 
var sut = builder.Create(); 
// if SomeType uses ISomeInterface.SomeProperty it will get 0 returned - *incorrect* 

這工作得很好:

var fixture = new Fixture().Customize(new AutoMoqCustomization()) 
fixture.Freeze<Mock<ISomeInterface>>().Setup(m => m.SomeProperty).Returns(10); 
var sut = fixture.Create<SomeType>(); 
// if SomeType uses ISomeInterface.SomeProperty it will get 10 returned - correct 

回答

1

,如果你調用生成器之前凍結它將工作

凍結 - 建造 - 創建序列

[TestClass] 
public class AutoFixtureTests { 
    [TestMethod] 
    public void _FreezeBuildCreate() { 
     //Arrange 
     var expected = 10; 
     var fixture = new Fixture().Customize(new AutoMoqCustomization()); 
     fixture.Freeze<Mock<ISomeInterface>>().Setup(m => m.SomeProperty).Returns(expected); 
     var builder = fixture.Build<SomeType>(); 
     var sut = builder.Create(); 

     //Act 
     var actual = sut.GetA(); 

     //Assert 
     Assert.AreEqual(expected, actual); 
    } 

    public class SomeType { 
     private ISomeInterface a; 
     public SomeType(ISomeInterface a) { 
      this.a = a; 
     } 
     public int GetA() { 
      return a.SomeProperty; 
     } 
    } 

    public interface ISomeInterface { 
     int SomeProperty { get; set; } 
    } 
} 

如果你看看Build方法

定義定製的生成算法的一個對象,在Ploeh.AutoFixture.IFixture有效 關閉所有自定義。

如果在凍結所有自定義之前調用構建將不會生效。

+0

感謝解釋。我實際上以另一種方式解決了這個問題 - 在Build-Create之間調用自定義事件,這樣我就可以將序列保持在不影響'Freeze's的地方 – SOReader

1

所以這就是我自己解決這個問題的方法。由於我在選擇Build - Create時沒有太多選擇,因此不得不爲此使用事件。哦,我不想讓Create虛擬。

下面是一些僞代碼:

public class BaseSutBuilder<TSut> { 
    // other weird stuff... 

    // somewhere in ctor: 
    protected BaseSutBuilder() { 
     SutBuilders = _ => {}; 
    } 

    protected Action<ICustomizationComposer<TSut>> SutBuilders { get; } 

    public TSut Create() { 
     var builder = _fixture.Build<TSut>(); 
     SutBuilders(builder); 
     return builder.Create(); 
    } 
} 

public class SomeTypeSutBuilder: BaseSutBuilder<SomeType> { 
    public SomeTypeSutBuilder() { 
     SutBuilders += c => c.With(....... 
     SutBuilders += c => c.With(....... 
    } 
}