1. 程式人生 > 實用技巧 >多執行緒測試

多執行緒測試

一般多執行緒
ublic static bool Changed;
public static async Task ChangeAsync()
{
    await Task.Run(() =>
    {
        Task.Delay(1000);
        Changed = true;
    });
}
[TestMethod()]
public async Task ChangeAsyncTest_OriginalFalse_ChangeToTrue()
{
    AsyncClient.Changed = false;
    await AsyncClient.ChangeAsync();
    Assert.IsTrue(AsyncClient.Changed);
}

在非同步單元測試方法中也必須返回Task,這是MSTest的約定,否則這個測試方法無法執行起來。

精確定位丟擲的異常

原始碼

public static async Task ChangeAsync()
{
    await Task.Run(() =>
    {
        throw new InvalidOperationException();
    });
}

測試程式碼

[TestMethod()]
public async Task ChangeAsyncTest_ThrowInvalidOperationException()
{
    await Assert.ThrowsExceptionAsync<InvalidOperationException>(async () =>
    {
        await AsyncClient.ChangeAsync();
    });
}
非同步方法mock
public interface ITextReader
{
    Task<string> ReadTextAsync();
}

測試程式碼中mock其返回結果可以有如下兩種寫法:

var mockTextReader = new Mock<ITextReader>();
//可以這樣
mockTextReader.Setup(x => x.ReadTextAsync()).Returns(async ()=>await Task.FromResult("mockValue"));
//也可以這樣
mockTextReader.Setup(x => x.ReadTextAsync()).ReturnsAsync(()=> "mockValue");