Проблема Funq AutoWire в NUnit + ServiceStack

Я тестировал свою бизнес-логику в проекте 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.Container? Или это баг? Любые обходные пути?

РЕДАКТИРОВАТЬ: я опубликовал вопрос на GitHub: https://github.com/ServiceStack/ServiceStack/issues/521


person Pavel Kudinov    schedule 15.03.2013    source источник


Ответы (1)


Существует частный статический словарь autoWireCache по адресу AutoWireHelpers.cs, который кэширует ваши разрешения. Когда вы запускаете тест дважды, значение извлекается из кеша, и ваш тест не проходит. Я считаю, что кэширование — это функция настроенного funq ServiceStack для повышения производительности.

Нет общедоступного интерфейса для очистки этого кеша, поэтому я не вижу быстрого решения того, как вы настроили тесты.

person kampsj    schedule 15.03.2013
comment
О да, я знал, что он где-то статичен... Но это действительно не самое подходящее место для него! Я думаю, что это должен быть конкретный экземпляр контейнера... Таким образом, решение может состоять в том, чтобы сделать класс AutoWireHelpers не статическим, autoWireCache не статическим и сделать этот класс полем контейнера. Но это внутренний рефакторинг, поэтому нам стоит прислушаться к @mythz. - person Pavel Kudinov; 15.03.2013
comment
@PavelKudinov эта проблема теперь решена и больше не использует статические методы. - person mythz; 19.03.2013