我在測驗 IDBconnection Mock 時遇到了麻煩,因為它給了我一個空資料庫。請注意,對于我的 IConfiguration 而不是模擬,我創建了一個帶有連接字串的 appsettingstest.json 到一個資料庫,用于測驗目的。但是對于 IDbConnection,我不知道如何傳遞 ConnectionString,因為這是我使用 Dapper 的第一個專案。
這是我的處理程式建構式:
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();
}
這是我的測驗類建構式:
private Mock<IDbConnection> _connection = new Mock<IDbConnection>();
private readonly SignalsHandler _handler;
private readonly IConfiguration _configuration;
private readonly SigSettings _settings;
public SignalsTest()
{
_configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(@"appsettingstest.json", false, false)
.AddEnvironmentVariables()
.Build();
_connection.Setup(x => x.ConnectionString).Returns(path);
_settings = _configuration.GetSection("SigSettings").Get<SigSettings>();
if (_settings == null)
_settings = new SigSettings();
_handler = new SignalsHandler(_configuration, _connection.Object);
}
那行得通,但是當我做一個測驗方法時,例如這個虛擬測驗:
public void CanGetAllSignals()
{
_connection.Setup(x => x.ConnectionString);
var result = _handler.GetSignals();
Assert.IsNotNull(result);
}
它呼叫這個方法:
public async Task<List<SignalsDTO>> GetSignals()
{
var res = new List<SignalsDTO>();
var sigList = await _dbConnection.QueryAsync<SigSignal>(_settings.Signals);
foreach (var s in sigList)
res.Add(new SignalsDTO(){IDTag = s.IDTag, Name = s.Name});
return res;
}
這就是我遇到問題的地方,因為它NullReferenceException: 'Object reference not set to an instance of an object'在這條線上給了我一個:var sigList = await _dbConnection.QueryAsync<SigSignal>(_settings.Signals);如果你_dbConnection查看它,你可以看到它是一個模擬物件,并且資料庫為空,所以這就是失敗。
我怎樣才能解決這個問題?我試圖嘲笑它,但也許這甚至不是最好的方法。
uj5u.com熱心網友回復:
問題在于該方法是一個擴展方法,而不是物件本身的方法。根據您使用的模擬框架,也可能有一種模擬擴展方法的方法(更新:kuldeep 的答案顯示了一種可能的方法)。
但是,由于您專門使用 Dapper,因此您可以查看現成的解決方案,例如https://github.com/UnoSD/Moq.Dapper for Moq。
它允許您撰寫如下測驗:
[Test]
public async Task QueryAsyncGeneric()
{
var connection = new Mock<DbConnection>();
var expected = new[] { 7, 77, 777 };
connection.SetupDapperAsync(c => c.QueryAsync<int>(It.IsAny<string>(), null, null, null, null))
.ReturnsAsync(expected);
var actual = (await connection.Object.QueryAsync<int>("", null, null, null, null)).ToList();
Assert.That(actual.Count, Is.EqualTo(expected.Length));
Assert.That(actual, Is.EquivalentTo(expected));
}
uj5u.com熱心網友回復:
你必須像下面這樣在 QueryAsync 上設定期望
this._connection
.Setup(s => s.QueryAsync<SigSignal>(
It.IsAny<Signals>())
.ReturnsAsync(yourFakeSigListWithTestData);
在 It.IsAny() 你應該傳入正確的物件,我只是把信號放在這里,但理想情況下它必須是 _settings.Signals 型別
編輯:
另一種可能的方法是你制作一個你自己的存根。實作 IDbConnection 然后將該存根作為依賴項傳遞,您可以在這個存根中基本上提供您自己的 IDbConnection 方法的實作,這些方法實際上在您的測驗路徑中被呼叫。
為了存根 IDbConnection 看看這個答案
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340224.html
上一篇:每次運行測驗時如何增加int
