[英]Testing async method produces weird result
當我正常運行測試代碼時,NUnit 通知我測試失敗。 值result.Contacts
是3而不是預期的1。當testcode與在測試代碼中的斷言語句斷點運行,測試不會失敗。 我懷疑這是與多線程相關的問題。
這是我的測試代碼
[Test]
public async Task Method_Scenario_IncreasesCount()
{
// Arrange
const int employeeId = 1;
const string managerId = "asdf";
// Act
var result = await _uut.Contact(managerId , employeeId);
// Assert
Assert.That(result.Contacts, Is.EqualTo(1));
}
這是測試中的代碼
public async Task<MyObject> Contact(string managerId, int employeeId)
{
var today = DateTime.UtcNow.Date;
var myStoredObject = _myObjectRepository.GetAll().Include(p => p.Employee).First(x => x.Employee.Id == employeeId);
myStoredObject.Contacts += 1;
myStoredObject.LastContact = today;
var dates = new List<DateTime>
{
myStoredObject.FirstDate,
myStoredObject.SecondDate,
myStoredObject.ThirdDate
};
if (!dates.Contains(today))
{
await _logging.Log(myStoredObject, Log.Extra);
await _myObjectRepository.UpdateAsync(myStoredObject);
}
return myStoredObject;
}
_myObjectRepository
和_logging
對象使用Moq
_logging
; 並且myStoredObject
是我預定義的,所以我知道Contacts 的值是 0 開始。
為什么只有當我在 assert 語句上使用斷點時測試才通過? 我該如何解決這個問題?
編輯
我也試過使用Moq
來做到這一點:
_mock.Verify(r => r.UpdateAsync(It.Is<MyObject>(m => m.Contacts == 1)));
但這也失敗了,一個 MockException 說:
預期在模擬上至少調用一次,但從未執行過。
但是,如果我逐步執行該程序,我可以看到使用具有Contacts = 1
的MyObject
調用此方法。
如果沒有看到您的[SetUp]
代碼,很難說是什么導致了您的問題。 我注意到你的模擬和被測單元是成員變量——也許與另一個測試共享狀態有問題。 我能夠編寫相同的測試,並始終如一地通過
[Test]
public async Task Method_Scenario_IncreasesCount()
{
// Arrange
const int employeeId = 55378008;
var existingEntity = new MyObject {Employee = new Employee {Id = employeeId}};
var repo = Mock.Of<IMyObjectRepo>(r => r.GetAll() == new[] {existingEntity}.AsQueryable());
var uut = new MyUut(repo, Mock.Of<ILog>());
// Act
var entity = await uut.Contact(string.Empty, employeeId);
// Assert
Assert.That(entity.Contacts, Is.EqualTo(1));
Mock.Get(repo).Verify(r => r.UpdateAsync(entity));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.