未在测试用例中输入的方法,正常运行时工作

时间:2017-04-20 13:02:11

标签: c# asp.net-mvc visual-studio-2015

我有一个非常奇怪的问题,我对导致这种行为的原因一无所知。

我将提供两个类的相关代码,以保持简短。

A类有一个获取xml文档并将其放入XDocument对象的方法,它使用B类中的方法。然后它使用B类中不同但相似的方法将一些额外的xml添加到XDocument中。

出于某种原因,当我运行测试用例时,从不输入B类的第二种方法。相反,它返回null。

以下是代码:

首先从A类调用B类中的方法

// Get view (xml) for current supplier
XDocument navigationView = ProductBUS.GetProductNavigationXDocument(suppID, viewName, selectedProductNavigationView);

第二次调用B类中的方法,来自A类(这是错误的)

if (true)
{
    navigationView = ProductBUS.AddOptionsToNavigationMenu(navigationView);
}

(if(true)是占位符代码,将来会更改为布尔值。此值需要来自DB,此时为空。)

分别为B,1和2类的方法。

public XDocument GetProductNavigationXDocument(Guid supplierID, String viewName, string selectedProductNavigationView)
{
        // TODO : implementing full scale DI
        INavigationViewFactory factory = new NavigationViewFactory();
        INavigationView navigationXml = factory.Create(NavigationViewTypes.Product);

        return navigationXml.GetNavigationXDocument(supplierID, viewName, selectedProductNavigationView);
}

第二个(永远不会进入)

public XDocument AddOptionsToNavigationMenu(XDocument menu)
{

        menu.Element(XmlNames.NodeNames.MenuItems).Add(
                new XElement(XmlNames.NodeNames.MenuItem,
                   new XAttribute(XmlNames.AttributeNames.ID, "27301D05-EBBB-4F39-AC74-B0E944F26C52"),
                   new XAttribute(XmlNames.AttributeNames.DefaultName, "Options"),
                   new XAttribute(XmlNames.AttributeNames.NameTranslationID, "9999"),
                   new XAttribute(XmlNames.AttributeNames.DisplayMode, "Options"),
                   new XElement(XmlNames.NodeNames.MenuItem,
                           new XAttribute(XmlNames.AttributeNames.ID, "27301D05-EBBB-4F39-AC74-B0E944F26C57"),
                           new XAttribute(XmlNames.AttributeNames.NameTranslationID, "9999"),
                           new XAttribute(XmlNames.AttributeNames.DefaultName, "Notifications"),
                           new XElement(XmlNames.NodeNames.Subscriptions,
                           new XElement(XmlNames.NodeNames.Subscription,
                                new XAttribute(XmlNames.AttributeNames.ID, "7"),
                                new XAttribute(XmlNames.AttributeNames.DefaultName, "Subscriptions"))))));


        return menu;
}

我在方法调用之前,之中和之后以及方法内部放置了断点。如果我运行该应用程序,我可以通过该方法进行调试。但是,当我运行一些覆盖这段代码的测试用例时,他们永远不会输入方法调用。相反,代码将navigationView等于null。我通过将方法的代码放在第一堂课中来解决这个问题,但我想知道为什么这是一个问题。

修改

以下是在测试时导致错误行为的其中一个测试用例的代码。

[TestMethod]
    public void GetProductDetailNavigationModel_ProductWith3FieldValuesAnd2Documents_MappedObjectIsNotNull()
    {
        // Arrange
        DDSInterfaceBlock.Current.IsImpersonated = false;
        Domain.Supplier supplier = new Domain.Supplier().Init();
        Domain.User user = new Domain.User().Init().Create();
        Domain.Language language = new Domain.Language().Init();
        Domain.Product product = new Domain.Product().Init().LinkSupplier(supplier);

        Domain.ProductOverview.ProductDetail productDetail = ArrangeProductDetailData(supplier, user, language, product);
        XDocument document = ArrangeXDocument(productDetail);

        ProductDetail svc = new ProductDetail();
        IProduct bus = MockRepository.GenerateStub<IProduct>();

        bus.Stub(t => t.GetProductNavigationXDocument(supplier.Id, null, string.Empty))
                       .IgnoreArguments()
                       .Return(document);

        bus.Stub(t => t.GetProductDetail(supplier.Id, user.Id, product.Id, language.Id, language.Id))
                       .IgnoreArguments()
                       .Return(productDetail);

        svc.ProductBUS = bus;

        svc.UserBUS = MockRepository.GenerateMock<BUS.Interfaces.IUser>();
        svc.UserBUS
            .Stub(t => t.CheckIfUserInPRAGroup(Guid.Empty))
            .IgnoreArguments()
            .Return(false);

        // Act
        Domain.ProductOverview.ProductDetailNavigationModel result
            = svc.GetProductDetailNavigationModel(supplier.Id, user.Id, product.Id, language.Id, language.Id);

        // Assert
        Assert.IsNotNull(result);
    }

1 个答案:

答案 0 :(得分:1)

可能是因为你有GetProductNavigationXDocument的存根,但没有AddOptionsToNavigationMenu的子