多线程测试

一般多线程

public 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");
posted @ 2020-08-07 18:01  wesson2019  阅读(274)  评论(0编辑  收藏  举报