2013-03-15 57 views
3

我一直在ServiceStack 3.9.38项目中测试自己的业务逻辑,并且在单独运行单元测试导致成功时遇到问题,并且一起运行测试会导致其中一个失败。几个小时后,我做了一个可重复的单元测试。如果你运行整个夹具,第二个测试将失败。分开运行测试使它们通过。NUnit + ServiceStack的Funq AutoWire问题

using Funq; 
using NUnit.Framework; 

[TestFixture] 
public class Test 
{ 
    interface IBar {} 
    class Bar : IBar {} 
    class TestFoo { public IBar Bar { get; set; } } 

    [Test] 
    public void Test1() 
    { 
     var container = new Container(); 
     var m = new TestFoo(); 
     container.Register<IBar>(new Bar()); 
     Assert.NotNull(container.Resolve<IBar>(), "Resolve"); 
     container.AutoWire(m); 
     Assert.NotNull(m.Bar, "Autowire"); 
    } 

    [Test] 
    public void Test2() 
    { 
     var container = new Container(); 
     var m = new TestFoo(); 
     container.AutoWire(m); 
     Assert.Throws<ResolutionException>(() => container.Resolve<IBar>()); 
     Assert.IsNull(m.Bar); // FAILS HERE 
    } 
} 

那是Funq.Container配置的问题?或者这是一个错误?任何解决方法?

编辑:我已经发布了一个问题,在GitHub上:https://github.com/ServiceStack/ServiceStack/issues/521

回答

3

有一个在AutoWireHelpers.cs一个私有静态辞典autoWireCache当你运行测试他们两次值从缓存中拉被缓存的决议你的测试失败了。我相信缓存是ServiceStack定制funq的一项功能,可以提高性能。

没有用于清除缓存的公共接口,所以我没有看到您有测试设置方式的快速解决方案。

+0

噢,是的,我知道它在某个地方是静止的......但它真的不是一个好地方!我认为它应该是容器实例特定的...所以解决方案可以是使AutoWireHelpers类不是静态的,autoWireCache不是静态的,并且使该类成为Container的字段。但是这是一个内核重构,所以我们应该听取@mythz – 2013-03-15 17:52:41

+2

@PavelKudinov现在这个问题已经解决,并且不再使用静态方法。 – mythz 2013-03-19 14:17:53