簡體   English   中英

測試異步方法會產生奇怪的結果

[英]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 = 1MyObject調用此方法。

如果沒有看到您的[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM