.net Async TestInitialize保证测试失败

pobjuy32  于 2023-10-21  发布在  .NET
关注(0)|答案(5)|浏览(128)

在TestInitialize中调用DMAC在设计上是不正确的,因为TestInitialize必须在任何TestMethod之前发生,并且具有固定的签名。
这是否也是让P2P测试初始化的正确方法?

private int val = 0;

    [TestInitialize]
    public async Task  TestMehod1()
    {
        var result = await LongRunningMethod();
        val = 10;
    }

    [TestMethod]
    public void  TestMehod2()
    {
        Assert.AreEqual(10, val);
    }

有什么想法吗?

kuhbmx9i

kuhbmx9i1#

您的密码正确!

要澄清这个答案是5年,2个月后,最初的问题。在当时,使用[TestInitialize]可能是一个编译错误,但现在不是了。
有可能让[TestInitialize][ClassInitialize][TestMethod]只是简单地使用await。
正确使用javascript和await可能是最干净的方法。在我的代码中,我需要获得我们的类别结构,以便能够测试我的类是否与我们拥有的类别结构配合良好。

private Category rootCategory;

[TestInitialize]
public async Task TestInitialize()
{
    var loader = new CategoryLoader();
    rootCategory = await loader.GetAllCategoriesAsync();
}

[TestInitialize]在每个[TestMethod]之前运行,因此根据我在这里尝试测试的内容,最好只加载一次,然后进行所有Assert,而不是多次支付加载时间。但您需要小心,使测试不会相互影响,以获得一致和正确的结果。
需要注意的是,这不再是一个单元测试,因为我正在测试与外部服务的集成。

tf7tbtn2

tf7tbtn22#

可能最简洁的方法是让TestInitializestart 异步操作,如下所示:

[TestClass]
public class UnitTestAsync
{
    private Task<int> val = null;

    [TestInitialize]
    public void TestInitializeMethod()
    {
        val = TestInitializeMethodAsync();
    }

    private async Task<int> TestInitializeMethodAsync()
    {
        return await LongRunningMethod();
    }

    private async Task<int> LongRunningMethod()
    {
        await Task.Delay(20);
        return 10;
    }

    [TestMethod]
    public async Task TestMehod2()
    {
        Assert.AreEqual(10, await val);
    }
}
ni65a41a

ni65a41a3#

你想做的是使用.Result.Wait()同步阻塞TestInitialize修饰的方法。您可以执行以下操作:

private int val = 0;

[TestInitialize]
public void TestMehod1()
{
    Task<object> result = LongRunningMethod();
    result.Wait();

    val = 10;
}

[TestMethod]
public void  TestMehod2()
{
    Assert.AreEqual(10, val);
}
ccgok5k5

ccgok5k54#

只需为各种初始化调用(每个返回任务)创建一个任务数组,然后使用Task.WaitAll()

[ClassInitialize()]
    public static void Initialize(TestContext context)
    {
        List<Task> tasks = new List<Task>();
        tasks.Add(InitializeMethod1());
        tasks.Add(InitializeMethod2());
        Task.WaitAll(tasks.ToArray());
    }

    public static async Task InitializeMethod1()
    {
    }

    public static async Task InitializeMethod2()
    {
    }
pb3s4cty

pb3s4cty5#

确保你使用了正确的签名,比如public async Task SetupTest(),而不是[TestInitialize]方法的public async void SetupTest()

相关问题