servicestack,funq,Nunit,servicestack,Funq" /> servicestack,funq,Nunit,servicestack,Funq" />

Nunit 努尼特+;ServiceStack';s Funq自动连线问题

Nunit 努尼特+;ServiceStack';s Funq自动连线问题,nunit,servicestack,funq,Nunit,servicestack,Funq,我一直在ServiceStack 3.9.38项目中测试我的业务逻辑,遇到了一个问题:单独运行单元测试会导致成功,而同时运行测试会导致其中一个失败。几个小时后,我做了一个可复制的单元测试。如果运行整个夹具,第二次测试将失败。单独运行测试可以使它们通过 using Funq; using NUnit.Framework; [TestFixture] public class Test { interface IBar {} class Bar : IBar {} clas

我一直在ServiceStack 3.9.38项目中测试我的业务逻辑,遇到了一个问题:单独运行单元测试会导致成功,而同时运行测试会导致其中一个失败。几个小时后,我做了一个可复制的单元测试。如果运行整个夹具,第二次测试将失败。单独运行测试可以使它们通过

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;
使用NUnit.Framework;
[测试夹具]
公开课考试
{
接口IBar{}
类栏:IBar{}
类TestFoo{public IBar Bar{get;set;}}
[测试]
公共void Test1()
{
var container=新容器();
var m=新的TestFoo();
容器。寄存器(新条());
Assert.NotNull(container.Resolve(),“Resolve”);
集装箱自动线(m);
Assert.NotNull(m.Bar,“Autowire”);
}
[测试]
公共无效测试2()
{
var container=新容器();
var m=新的TestFoo();
集装箱自动线(m);
抛出(()=>container.Resolve());
Assert.IsNull(m.Bar);//此处失败
}
}
这是Funq.Container配置的问题吗?还是这是一只虫子?有解决办法吗


编辑:我在GitHub上发布了一个问题:

有一个私有静态字典autoWireCache在运行测试时,它会缓存您的分辨率。如果从缓存中提取两次值,测试就会失败。我相信缓存是ServiceStack定制funq的一项功能,可以提高性能


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

哦,是的,我知道它在某个地方是静态的。。。但这真的不是一个好地方!我认为它应该是特定于容器实例的。。。因此,解决方案可以是使AutoWireHelpers类不是静态的,autoWireCache不是静态的,并使该类成为容器的字段。但这是一个核心内重构,所以我们应该听听@mythz@PavelKudinov这个问题现在已经解决,不再使用静态方法。