Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步测试初始化保证测试失败_C#_.net_Unit Testing_Asynchronous_Tdd - Fatal编程技术网

C# 异步测试初始化保证测试失败

C# 异步测试初始化保证测试失败,c#,.net,unit-testing,asynchronous,tdd,C#,.net,Unit Testing,Asynchronous,Tdd,在TestInitialize中进行异步调用是不正确的,因为TestInitialize必须在任何TestMethod之前进行,并且具有固定的签名 这是否也是异步测试初始化的正确方法 private int val = 0; [TestInitialize] public async Task TestMehod1() { var result = await LongRunningMethod(); val = 10;

在TestInitialize中进行异步调用是不正确的,因为TestInitialize必须在任何TestMethod之前进行,并且具有固定的签名

这是否也是异步测试初始化的正确方法

    private int val = 0;

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

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

有什么想法吗?

您想做的是使用
.Result
.Wait()
同步阻止
测试初始化方法。您可以执行以下操作:

private int val = 0;

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

    val = 10;
}

[TestMethod]
public void  TestMehod2()
{
    Assert.AreEqual(10, val);
}
private int val=0;
[测试初始化]
公共无效测试方法1()
{
任务结果=等待LongRunningMethod();
result.Wait();
val=10;
}
[测试方法]
公共无效测试方法2()
{
断言.AreEqual(10,val);
}

最干净的方法可能是让
测试初始化
启动异步操作,如下所示:

[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);
    }
}
[TestClass]
公共类UnitTestAsync
{
私有任务val=null;
[测试初始化]
public void TestInitializeMethod()
{
val=TestInitializeMethodAsync();
}
专用异步任务TestInitializeMethodAsync()
{
return wait LongRunningMethod();
}
专用异步任务LongRunningMethod()
{
等待任务。延迟(20);
返回10;
}
[测试方法]
公共异步任务TestMehod2()
{
Assert.AreEqual(10,等待值);
}
}

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

[ClassInitialize()]
公共静态void初始化(TestContext上下文)
{
列表任务=新列表();
tasks.Add(InitializeMethod1());
tasks.Add(InitializeMethod2());
Task.WaitAll(tasks.ToArray());
}
公共静态异步任务InitializeMethod1()
{
}
公共静态异步任务InitializeMethod2()
{
}

您的代码是正确的

澄清这个问题的答案是5年后,2个月后的最初问题。当时使用async
[TestInitialize]
可能是一个编译错误,但现在不是了

可以使用async
[TestInitialize]
、async
[ClassInitialize]
和async
[TestMethod]
只需使用Wait即可

正确使用async和Wait可能是最干净的方法。我的代码中有如下内容,我需要获得我们的类别结构,以便能够测试my类是否与我们现有的类别结构配合良好

private Category rootCategory;

[TestInitialize]
public async Task TestInitialize()
{
    var loader = new CategoryLoader();
    rootCategory = await loader.GetAllCategoriesAsync();
}
[TestInitialize]
在每次
[TestMethod]
之前运行,因此根据我在这里尝试测试的内容,最好只加载一次,然后进行所有断言,而不必多次支付加载时间。但是你需要小心,这样测试就不会相互影响,从而得到一致和正确的结果


请注意,这不再是单元测试,因为我正在测试与外部服务的集成。

您不觉得这有点冒险吗?如果依赖于初始化完成,则每次测试都应等待初始化完成。忘记一个,它可能会很好;最终,首先运行并等待初始化的测试被删除,而不相关的测试被中断。看起来异步同步调用是其中一种危害较小的情况。@romkyns:如果你愿意,你可以这样做。任何一种方法都同样有风险——你有一个
任务
,如果不等待或阻止它,你就无法到达
t
。当然,您可以忘记等待(假设您不需要
t
),就像您可以忘记阻止一样。就我个人而言,我从来没有在任何单元测试中使用过初始化方法。如果我需要共享初始化代码,我会在我的测试项目中引入一个实际的类型,必要时由我的各个测试使用。这不会编译。不能在未使用
async
修饰符声明的方法中使用
wait
关键字。第六行应该是:
Task result=LongRunningMethod()MSTest V1:没有编译器错误,但存在运行时错误:
方法的签名错误。该方法必须是非静态的、公共的、不返回值且不应采用任何参数。
。MSTest V2:这不正确:“…签名错误。该方法必须是非静态的、公共的、不返回值且不应接受任何参数。”这不正确:“…签名错误。该方法必须是非静态的、公共的、不返回值且不应接受任何参数。”
private Category rootCategory;

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