.InRequestScope()
сам называет: IBindingSyntax.InScope(Func<IContext, object> scope);
В ScopeCallback (Func<IContext, object> scope
) могут быть получены с помощью:
kernel
.GetBindings(typeof(IService))
.Single()
.ScopeCallback
Но сравнивая Func не очень хорошая вещь , Он чувствует себя очень хак, но мы можем сделать следующие действия для получения области действия запроса обратного вызова для сравнения:
private Func<IContext, object> RetrieveInRequestScopeCallback()
{
using (var kernel = new StandardKernel())
{
kernel.Bind<object>().ToSelf().InRequestScope();
return kernel.GetBindings(typeof(object)).Single().ScopeCallback;
}
}
теперь тестовый модуль как следующий будет проходить:
[Fact]
public void Foo()
{
Func<IContext, object> inRequestScopeCallback = RetrieveInRequestScopeCallback();
var kernel = new StandardKernel();
kernel.Bind<string>().ToSelf().InRequestScope();
IBinding binding = kernel.GetBindings(typeof(string)).Single();
binding.ScopeCallback.Should().Be(inRequestScopeCallback);
}
(я использовал FluentAssertions и xunit)
Но, как я уже сказал, это хаки. Почему вы хотите проверить привязки? Я предлагаю, что было бы лучше инвестировать это время в создание автоматизированных интеграционных/системных тестов. Обычно это путь к контейнерам DI: вы не проверяете, правильно ли вы их настроили, вы проверяете это с помощью интеграционных и системных тестов.
Я хотел удостовериться, что класс с одноразовыми зависимостями сам связан с 'InRequestScope()', чтобы избежать одноразовых зависимостей, имеющих срок службы дольше, чем один запрос. Я понимаю, что когда, например, тип с привязкой 'InSingletonScope()' имеет зависимость с привязкой 'InRequestScope()', эта зависимость действительно не будет удаляться в конце запроса (из-за класса на котором живет эта зависимость). Я хотел написать тест, чтобы разработчик не забыл, что это вызывает неожиданное поведение. Если есть другой способ, дайте мне знать. – bump
@bump вы ищете [зависимые ссылки] (http://blog.ploeh.dk/2014/06/02/captive-dependency/). [Замок] (http://docs.castleproject.org/Windsor.MainPage.ashx) и [Простой инжектор] (https://simpleinjector.org) имеют встроенные механизмы обнаружения. – qujck
yes @qujck прав. Если это действительно важно для вас, я бы переключился на одну из фреймворков, которые он упомянул, или создать соответствующий запрос на тяну. К сожалению, я думаю, что запросы на Ninject pull потребуют очень много времени, чтобы пройти/принять. – BatteryBackupUnit