4

我試圖寫一個類中的xUnit測試(在.NET的核心項目),看起來像:實例化IOptions <>中的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 
    } 
}` 

注:FoodList實際上是一個JSON文件,包含數據,該文件在啓動類中加載和配置。

如何使用適當的依賴注入來編寫xunit測試來測試IsFoodItemPresentInList方法?

+0

[AutoFixture(https://github.com/autofixture)productises這種自動的連接最多你的測試安排相非常好[不是100%的確定是否它支持您正在使用的特定版本的.NET Core]。 @metalheart是正確的,xunit本身並沒有這樣做 - 雖然v2確實允許使用共享燈具的測試集合,但它的使用習慣遠不符合你的建議 –

回答

3

在單元測試中,您通常不使用依賴注入,因爲它是您控制創建測試對象的人。

要提供一個合適的對象來實現IOptions<FoodList>,您可以自己實現具有所需行爲的假類,或者使用一些模擬框架即時配置實例,例如Moq

+0

實際上,它可以非常方便使用一個容器服務於混合SUT和模擬/存根測試,只要你有便利的輔助方法來設置。看看我建立的這個例子:https://github.com/uWebshop/uWebshop-Releases/blob/master/Tests/uWebshop.Test/Services/PaymentProviderServiceTests.cs – mnwsmit

3

我遇到了一個類似的問題(使用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) 
     // ... 
    } 
} 

此外,你應該 「appSettings.json」 複製到項目的根文件夾。

+0

你能幫助我嗎? 我今天發佈的問題有類似的問題,請檢查並更新我。 https://stackoverflow.com/questions/47928678/how-to-pass-service-config-to-the-xunit-project-test-controller –

1

正如其他答案所建議的,在您的測試類中,您可以創建一個用於測試的選項實例。

你可以這樣做;

public class FakeFoodList : IOptions<FoodList> 
{ 
    public FoodList Value 
    { 
     get 
     { 
      return new FoodList(); // TODO: Add your settings for test here. 
     } 
    } 
} 

然後像這樣調用它;

var foodOptions = new FakeFoodList(); 
var foodStore = new FoodStore(foodOptions); 

var response = foodStore.Act(); 

Assert.Equal("whatever", response); 
4

您可以使用OptionsWrapper<T>類來僞造您的配置。然後你可以將這個對象傳遞給你想要測試的類。這樣你就不必使用DI或讀取真實的配置。

事情是這樣的:

var myConfiguration = new OptionsWrapper<MyConfiguration>(new MyConfiguration 
      { 
       SomeConfig = "SomeValue" 
      }); 
var yourClass = new YourClass(myConfiguration); 
相關問題