在xunit中实例化IOptions <>

Mic*_*ell 5 dependency-injection xunit xunit.net asp.net-core asp.net-core-1.0

我正在尝试为一个类(在.net Core项目中)编写一个xunit测试,它看起来像:

public Class FoodStore:IFoodStore
{
    FoodList foodItems;

    public FoodStore(IOptions<FoodList> foodItems)
    {
        this.foodItems = foodItems;
    }

    public bool IsFoodItemPresentInList(string foodItemId)
    {
        //Logic to search from Food List
    }
}`
Run Code Online (Sandbox Code Playgroud)

注意:FoodList实际上是一个包含数据的json文件,它在Startup类中加载和配置.

如何编写带有适当依赖注入的xunit测试来测试IsFoodItemPresentInList方法?

mik*_*igs 9

您可以创建一个IOptions<FoodList>使用该Options.Create方法的实例:

var foodListOptions = Options.Create(new FoodList());
Run Code Online (Sandbox Code Playgroud)


小智 8

您可以使用OptionsWrapper<T>类伪造您的配置.然后,您可以将此对象传递给要测试的类.这样您就不必使用DI或读取实际配置.

像这样的东西:

var myConfiguration = new OptionsWrapper<MyConfiguration>(new MyConfiguration
            {
                SomeConfig = "SomeValue"
            });
var yourClass = new YourClass(myConfiguration);
Run Code Online (Sandbox Code Playgroud)


小智 6

我遇到了类似的问题(使用 xUnit),经过一番挣扎,我解决了。

答案来得太晚了,但应该对其他人有帮助。


对于您的问题:

public Class FoodStoreTest
{
    private readonly IConfigurationRoot _configuration;
    private readonly IServiceProvider _serviceProvider;

    public FoodStoreTest(){
            // read Json
            var configBuilder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();
            _configuration = configBuilder.Build();

            // SetUp DI
            var services = new ServiceCollection();
            services.AddOptions(); // this statement is required if you wanna use IOption Pattern.

            services.Configure<YuntongxunOptions>(_configuration.GetSection("yuntongxun"));
            _serviceProvider = services.BuildServiceProvider();
    }

    [Fact]
    public void GetFootItemOption()
    {
         IOption<FoodList> optionAccessor = _serviceProvider.GetService<IOptions<FoodList>>();
         FoodList footListOptions = optionAccessor.value;
         Assert.NotNull(footListOptions)
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您应该将“appSettings.json”复制到您的项目根文件夹。


met*_*art 3

在单元测试中,您通常不使用依赖注入,因为是您控制测试对象的创建。

要提供一个合适的对象来实现,IOptions<FoodList>您可以自己实现一个具有所需行为的假类,或者使用一些模拟框架来动态配置实例,例如Moq