C# 单元测试中的非静态字段don';t在第二次和进一步测试运行时更新

C# 单元测试中的非静态字段don';t在第二次和进一步测试运行时更新,c#,.net,unit-testing,mstest,microsoft-fakes,C#,.net,Unit Testing,Mstest,Microsoft Fakes,我遇到了这种奇怪的情况,看不到任何解释 [TestClass] public class DbHelpersTests { int addCalls; int commitCalls; int updateCalls; [TestInitialize] public void SetUp() { StubICustomerRepository stubRepo = new StubICustomerRepository()

我遇到了这种奇怪的情况,看不到任何解释

[TestClass]
public class DbHelpersTests
{
    int addCalls;
    int commitCalls;
    int updateCalls;

    [TestInitialize]
    public void SetUp()
    {
        StubICustomerRepository stubRepo = new StubICustomerRepository()
        {
            AddCustomerModelBoolean = (model, autoSave) => 
            {
                addCalls++;
                return true;
            },

            Commit = () => 
            {
                commitCalls++;
                return true;
            }
        };

        StubIOrderRepository orderRepo = new StubIOrderRepository()
        {
            AddOrderBoolean = (order, save) => 
            {
                addCalls++;
                return true;
            },

            UpdateOrderBoolean = (order, save) =>
            {
                updateCalls++;
                return true;
            }
        };
        ...
    }

    [TestCleanup]
    public void CleanUp()
    {
        addCalls = 0;
        commitCalls = 0;
        updateCalls = 0;
    }

    [TestMethod]
    public void AddMultipleCustomers()
    {
        ...
        List<Customer> data = PrepareData(10);
        // commit after each 2 customers
        DbHelpers.InsertAllCustomers(data, 2);

        Assert.AreEqual(10, addCalls);
        Assert.AreEqual(5, commitCalls);
    }

    [TestMethod]
    public void AddSingleOrder()
    {
        ...
        DbHelpers.InsertOrder(new Order());

        Assert.AreEqual(1, addCalls);
    }

    [TestMethod]
    public void UpdateSingleOrder()
    {
        ...
        DbHelpers.UpdateOrder(new Order());

        Assert.AreEqual(1, updateCalls);
    }
}
[TestClass]
公共类DbHelperTests
{
int addCalls;
国际通讯社;
int-updateCalls;
[测试初始化]
公共作废设置()
{
StubicCustomerRepository stubRepo=新的StubicCustomerRepository()
{
AddCustomerModelBoolean=(模型,自动保存)=>
{
addCalls++;
返回true;
},
提交=()=>
{
commitCalls++;
返回true;
}
};
StubIOrderRepository orderRepo=新建StubIOrderRepository()
{
AddOrderBoolean=(顺序,保存)=>
{
addCalls++;
返回true;
},
UpdateOrderBolean=(订单,保存)=>
{
updateCalls++;
返回true;
}
};
...
}
[测试清理]
公共空间清理()
{
addCalls=0;
commitCalls=0;
updateCalls=0;
}
[测试方法]
public void AddMultipleCustomers()
{
...
列表数据=准备数据(10);
//每2个客户之后提交
DbHelpers.InsertAllCustomers(数据,2);
aresequal(10个addCalls);
断言.AreEqual(5,commitCalls);
}
[测试方法]
公共无效AddSingleOrder()
{
...
DbHelpers.InsertOrder(neworder());
aresequal(1,addCalls);
}
[测试方法]
public void UpdateSingleOrder()
{
...
DbHelpers.UpdateOrder(neworder());
aresequal(1,updateCalls);
}
}
当我运行测试时,第一个
AddMultipleCustomers
通过,后面两个不通过。它们失败是因为
addCalls
updateCalls
字段均为0

当我只运行
AddSingleOrder
测试时,它通过了测试。与
UpdateSingleOrder
相同

为什么在运行所有测试时,在第二次和后续测试运行中,
addCalls
updateCalls
字段不再更新


当我将字段声明更改为
static int addCalls时,所有测试均通过。为什么?

您是否在调试器中完成了它?我认为DbHelpers是静态方法。没有更多的代码。。。由于每次测试都调用TestInitialized,因此会生成新的存根,但可能静态方法仍在引用第一个存根和类变量的第一个实例(它们在每次运行后都会重新创建)。因此,第二次和第三次运行将引用设置为0的字段的新版本,并且存根将递增第一个版本。您应该能够使用调试器进行检查(只需在cleanup方法中删除显式设置为0)