gpt4 book ai didi

ioc-container - 使用 LightInject 和 Nsubstitute 自动模拟,如何?

转载 作者:行者123 更新时间:2023-12-04 17:35:01 24 4
gpt4 key购买 nike

我是这两个库的新手,在将它们用于大型项目之前,我需要澄清我的单元测试中低代码工作自动模拟的选项。

在谷歌上花了一些时间后,我得出的结论是,与其他一些 IOC/Mocking 产品配对不同,LightInject+Nsubstitute 没有现成的插件库来简化单元编排阶段无操作默认模拟的声明测试。

我已经阅读了关于如何使用临时增强模拟对象覆盖 LightInject 容器的 LightInject 文档,仅用于单元测试的范围 但是单元测试可能会触及的所有无作为默认隔离模拟呢?有没有办法在 LightInject 容器中自动创建它们?

我正在寻找的内部 IOC 容器行为是:

public class LightInject.ServiceContainer
{
..

public T GetInstance<T)
{
if (( this.RegisteredInterfaces.Any( i => i.Itype == T ) == false )
&& ( this.TemporaryUnitTestOverrides.Any( i => i.Itype == T ) == false ))
&& ( /* this container is configured with an automocking delegate */ ))
return autoMockCreatorDelegate<T>.Invoke();
}

看起来 LightInject 的 IProxy 和 Interceptors 提供了一些内部模拟对象构建块,但相比之下 Nsubstitute 库功能齐全。

澄清我的意思默认不做任何模拟和增强模拟。
   // default do nothing mock
var calculator = Substitute.For<ICalculator>();

// Enhanced mock that will return 3 for .Add(1,2)
var calculator = Substitute.For<ICalculator>();
calculator.Add(1, 2).Returns(3);

显然,第二个增强类型的模拟需要在每个单元测试本地制作。

最佳答案

我是 LightInject 的作者,我真的很想帮助你。

让我调查一下,然后再回复你。同时,您可能想在以下位置查看此库
LightInject.AutopMoq这是对 LightInject 容器的第三方贡献。它使用 Moq 而不是 NSubstitute,但一般概念应该与您所要求的相似。

话虽如此,我不久前做了一些工作,进一步简化了自动模拟,并将对其进行研究,看看如何将其与 NSubstitute 集成。

编辑

这是一个 super 简单的自动模拟实现,适用于任何“替代”框架。

using System.Diagnostics;
using LightInject;
using NSubstitute;

public interface IFoo { }

class Program
{
static void Main(string[] args)
{
var serviceContainer = new ServiceContainer();
serviceContainer.RegisterFallback((type, s) => true, request => CreateMock(request.ServiceType));
var foo = serviceContainer.GetInstance<IFoo>();
Debug.Assert(foo is IFoo);
}

private static object CreateMock(Type serviceType)
{
return Substitute.For(new Type[] { serviceType }, null);
}
}

此致

伯恩哈德·里希特

关于ioc-container - 使用 LightInject 和 Nsubstitute 自动模拟,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23445099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com