我有一个非常奇怪的问题,我对导致这种行为的原因一无所知。
我将提供两个类的相关代码,以保持简短。
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);
}
答案 0 :(得分:1)
可能是因为你有GetProductNavigationXDocument的存根,但没有AddOptionsToNavigationMenu的子