当单独运行到作为集合的一部分运行时,使用Moq的C#单元测试表现不同

时间:2015-12-21 17:13:14

标签: c# unit-testing moq

我有一个单元测试,用于验证(使用Moq)调用特定函数的次数。它应该被调用两次。

在Visual Studio中右键单击并运行它时,测试通过。当你运行整个套件 - 包括这个测试 - 这个测试,只有这个测试失败,说这个函数只被调用一次。

没有为此测试运行的设置或拆卸功能 - 只是模拟存储库和几行测试代码。

右键单击以运行测试时,我可以调试它并验证函数是否确实被调用了两次。但据我所知,我无法在调试模式下运行整个测试套件。

我怎样才能找出为什么这个测试在单个和套件运行中表现不同?

编辑:代码。我正在验证SaveChanges()方法

public override void SaveChanges()
{
    bool isNew = CurrentCampaign.IsNewCampaign;
    DocTreeViewModel.SaveChanges(); //this method posted below

    using (IRepository r = Rep.Renew())
    {
        foreach (Quote quote in CurrentCampaign.Quotes)
        {
            r.Update(quote);
        }

        r.SaveChanges(); // called here
    }

    if (isNew)
    {
        CreateScheduleDocument();
    }
}

// this is the code in DocTreeViewModel.SaveChanges
public override void SaveChanges()
{
    using(IRepository r = Rep.Renew())
    {
        // Flatten is an extension method to flatten a recursive tree
        foreach(DocumentCategory dc in DocumentCategories.Flatten()) 
        {
            r.Update(dc);
        }

        r.SaveChanges(); //called here
    }
}

// mock setup
private Mock<IRepository> GetMockRepository()
{
    Mock<IRepository> repMock = new Mock<IRepository>();
    repMock.Setup(m => m.Renew()).Returns(repMock.Object);

    repMock.Setup(m => m.Update(It.IsAny<Campaign>())).Verifiable();

    repMock.Setup(m => m.SaveChanges()).Verifiable();

    ItemType it1 = new ItemType { ItemTypeId = 1 };
    repMock.Setup(m => m.GetItemTypes()).Returns((new List<ItemType> { it1 }).AsQueryable);

    return repMock;
}

//test
[TestMethod]
public void Assert_SignOff_ChangesStatusEnum()
{
    Mock<IRepository> repMock = GetMockRepository();
    CampaignOverviewViewModel vm = new CampaignOverviewViewModel(new Campaign(), repMock.Object, new Mock<IMsgBoxService>().Object);

    vm.SignOff(); //this calls SaveChanges
    Assert.AreEqual(CampaignStatus.Signed, vm.CurrentCampaign.StatusEnum);
    repMock.Verify(m => m.SaveChanges(), Times.Exactly(2));
}

0 个答案:

没有答案