2 回答

TA貢獻1821條經驗 獲得超5個贊
您的測試正確失敗,因為您嘗試驗證 GetAll() 是否被調用,即使您實際上并未調用它。
如果在測試或正在測試的代碼中調用該方法,它將通過。
[Fact]
public async Task Test1()
{
var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);
m.Setup(p => p.GetAll()).ReturnsAsync(new List<Foo>());
var result = await m.Object.GetAll();
m.VerifyAll();
}
線索在您的錯誤消息中:消息=模擬上的以下設置....不匹配: IReadAccess p => p.GetAll()

TA貢獻1802條經驗 獲得超10個贊
這是預期的工作,但我有類似的方法
public interface IReadAccess<TEntity>
{
Task<IEnumerable<TEntity>> GetAll();
Task<IEnumerable<TEntity>> Find(FormattableString whereClause, object whereClauseObject);
}
并嘗試設置
var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);
m.Setup(x => x.Find($"ID = @ID", new { ID = 5 })).ReturnsAsync(new List<Foo>());
var result = await m.Object.Find($"ID= @ID", new { ID = 5 });
m.VerifyAll();
在對現有代碼進行了一些更改后,現在安裝程序工作正常,但是當它從測試,更新的代碼調用時,實際服務會出現錯誤
var test = new Test {ID = 5};
object whereClause = new { ID = test.ID };
FormattableString formattableString = $"ID = @ID";
m.Setup(x => x.Find(formattableString, whereClause)).ReturnsAsync(new List<Foo>());
var ruleServiceOutput = await this.testValidationRuleService.ExecuteAsync(test);
實際代碼
public async Task<IRuleServiceOutput<bool>> ExecuteAsync(Test test)
{
var errors = new List<string>();
object whereClause = new { ID = test.ID };
FormattableString formattableString = $"ID = @ID";
var output = (await m.Find(formattableString, whereClause)).ToArray();
return new RuleServiceOutput<bool>(output.Errors.IsEmpty(), output.Errors);
}
'IReadAccess'1.Find(ID = @ID, { ID = 5 }) 調用失敗,模擬行為嚴格。模擬上的所有調用都必須具有相應的設置。
設置 MockBehavior 后。默認所有正常工作的預期:)
- 2 回答
- 0 關注
- 110 瀏覽
添加回答
舉報