丢失委托价值的字段

时间:2011-01-17 09:53:42

标签: c# delegates closures

我试图了解这里发生的事情。我正在为asynch'd远程代码编写一些单元测试

    // a global variable to all unit tests in the class
    private List<ModuleInfo> _moduleInfo;

    [TestMethod]
    public void MyFunction()
    {
           _moduleInfo = new List<ModuleInfo>();

            netCall.MessageRecieved +=
                    delegate(object sender, MessageTestRecievedEventArgs e)
                    {
                       // I get a correct response - array of Modules
                       // then try to add to global variable
                       foreach (EducateMe.Shared.Types.ModuleInfo mIn in arr)
                       {
                           _moduleInfo.Add(mIn);
                       }
                    }

    }

//所以在循环之后变量_moduleInfo count = 9 // next运行但是变量为空的测试 - 所以当它离开闭包时它会以某种方式重置 - 我怎样才能在测试之间保留这个值?

更新 -

这就是数组的定义方式。没有使用[Setup]或[TearDown]。

[TestClass]
public class MyUnitTest
{
  private List<ModuleInfo> _moduleInfo;

  // then the function definition

}

第二个单元测试只是尝试读取循环创建的值。所以MyFunction()测试传递正常,但一旦它退出闭包,变量就会消失。

干杯

PS。这是VS创建的单元测试

    private TestContext testContextInstance;

    /// <summary>
    ///Gets or sets the test context which provides
    ///information about and functionality for the current test run.
    ///</summary>
    public TestContext TestContext
    {
        get
        {
            return testContextInstance;
        }
        set
        {
            testContextInstance = value;
        }
    }

2 个答案:

答案 0 :(得分:0)

不知道您正在使用哪个测试框架,但在NUnit中有一些方法可以具有属性[Setup][TearDown]。也许其中一个函数会重置列表?

然而,对于单元测试来说,这是一个非常糟糕的设计。通过这种方式,您可以设计两个测试之间的耦合。因此,如果不运行第一个测试,您就永远无法运行第二个测试,如何确保运行哪个订单测试?

因此,编写一些实用程序函数,在每个测试中用一些包含预期值的存根填充_ moduleInfo

关于如何进行测试的一个非常好的来源是书The Art of Unit Testing: With Examples in .Net

答案 1 :(得分:0)

您确定不只是为每个测试创建测试类的新实例吗?对我来说这似乎是非常合理的行为 - 一个测试不应该依赖于已经执行的其他测试。看起来您应该使用[SetUp]代替。