C# 测试用例中未输入方法,正常运行时有效
我有一个非常奇怪的问题,我不知道是什么导致了这种行为 为了简短起见,我将提供两个类的相关代码 类A有一个方法,该方法获取xml文档并将其放入XDocument对象中,它使用类B中的方法来实现此目的。然后,它使用与类B不同但类似的方法向XDocument添加一些额外的xml 出于某种原因,当我运行测试用例时,从未输入B类的第二个方法。相反,它返回null 代码如下: 从类a首次调用类B中的方法C# 测试用例中未输入方法,正常运行时有效,c#,asp.net-mvc,visual-studio-2015,C#,Asp.net Mvc,Visual Studio 2015,我有一个非常奇怪的问题,我不知道是什么导致了这种行为 为了简短起见,我将提供两个类的相关代码 类A有一个方法,该方法获取xml文档并将其放入XDocument对象中,它使用类B中的方法来实现此目的。然后,它使用与类B不同但类似的方法向XDocument添加一些额外的xml 出于某种原因,当我运行测试用例时,从未输入B类的第二个方法。相反,它返回null 代码如下: 从类a首次调用类B中的方法 // Get view (xml) for current supplier XDocument nav
// Get view (xml) for current supplier
XDocument navigationView = ProductBUS.GetProductNavigationXDocument(suppID, viewName, selectedProductNavigationView);
从类a对类B中的方法的第二次调用(这是错误的一次)
(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);
}
第二个(从未输入)
我在方法调用之前、之上和之后以及方法内部放置断点。如果我运行应用程序,我可以通过该方法进行调试。但当我运行一些测试用例时,这些测试用例覆盖了这段代码,它们的方法调用从未被输入。相反,代码将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);
}
[TestMethod]
public void GetProductDetailNavigationModel_Product with 3字段值和2文档
{
//安排
dds InterfaceBlock.Current.IsImpersonated=false;
Domain.Supplier Supplier=新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(供应商);
Domain.ProductOverview.ProductDetail ProductDetail=安排ProductDetailData(供应商、用户、语言、产品);
XDocument document=安排XDocument(productDetail);
ProductDetail svc=新的ProductDetail();
IPProduct bus=MockRepository.GenerateSub();
bus.Stub(t=>t.GetProductNavigationXDocument(supplier.Id,null,string.Empty))
.IgnoreArguments()
.报税表(文件);
bus.Stub(t=>t.GetProductDetail(supplier.Id、user.Id、product.Id、language.Id、language.Id))
.IgnoreArguments()
.退货(产品详情);
svc.ProductBUS=总线;
svc.UserBUS=MockRepository.GenerateMock();
用户总线
.Stub(t=>t.CheckIfUserInPRAGroup(Guid.Empty))
.IgnoreArguments()
。报税表(虚假);
//表演
Domain.ProductOverview.ProductDetailNavigationModel结果
=svc.GetProductDetailNavigationModel(supplier.Id、user.Id、product.Id、language.Id、language.Id);
//断言
Assert.IsNotNull(结果);
}
可能是因为您有GetProductNavigationXDocument的存根,但没有AddOptions的sub ToNavigationMenu是另一个程序集中的第二个类吗?是另一个命名空间。但它在另一个项目中吗?如果是这样的话,您的测试用例可能正在使用不同的版本运行。不,它是同一个项目。如果是的话,如果我也运行这个项目,它不会抛出错误吗?你有测试用例的代码吗?你在模拟任何对象吗?
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;
}
[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);
}