我正在徘徊如何做到這一點,因為它給了我 nullreferenceexception。我的處理程式類上有這個建構式:
IDbConnection _dbConnection;
Context _context;
SigSettings _settings;
public SignalsHandler(IConfiguration configuration, IDbConnection connection)
{
_dbConnection = connection;
_settings = configuration.GetSection("SigSettings").Get<SigSettings>();
if (_settings == null)
_settings = new SigSettings();
}
我想對這個類進行單元測驗來測驗我的 crud 方法,但下面的代碼不起作用:
private Mock<IConfiguration> _configuration = new Mock<IConfiguration>();
private Mock<IDbConnection> _connection = new Mock<IDbConnection>();
private readonly SignalsHandler _handler;
public SignalsTest()
{
_handler = new SignalsHandler(_configuration.Object, _connection.Object);
}
它給了我這個錯誤: System.ArgumentNullException: '值不能為空。Arg_ParamName_Name' 在這一行:_settings = configuration.GetSection("SigSettings").Get();
有什么幫助嗎?
uj5u.com熱心網友回復:
_configuration只是模擬物件,您還需要設定它具有的方法,否則,它們將回傳null,因此configuration.GetSection("SigSettings")將回傳null。
為避免這種情況,您需要撰寫:
_configuration
.Setup(x => x.GetSection("SigSettings"))
.Returns("some setting");
或更一般地說:
_configuration
.Setup(x => x.GetSection(It.IsAny<string>()))
.Returns("some setting");
更新
由于我沒有意識到方法回傳一些物件而不是string,這里是完整的設定。通常,您總是為所有方法呼叫方式提供模擬,因此您將無處獲得null:
var configSectionMock = new Mock<IConfigurationSection>();
var configMock = new Mock<IConfiguration>();
configMock
.Setup(x => x.GetSection(It.IsAny<string>()))
.Returns(configSectionMock.Object);
// Instantiate system under test with mocked object.
var sut = new Sut(configMock.Object);
uj5u.com熱心網友回復:
替代方法不是模擬IConfiguration,而是提供實際實作,該實作提供有用的反饋,而無需與被測類中使用的方法耦合。
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(new[]
{
new KeyValuePair<string, string>("SigSettings:One", "value1"),
new KeyValuePair<string, string>("SigSettings:Two", "value2"),
})
.Build();
var sut = new Sut(configuration);
現在,Sut您可以使用不同的方式訪問配置值而無需重寫測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/336830.html
