发布单元测试Sitecore和带有NUNIT的玻璃

发布单元测试Sitecore和带有NUNIT的玻璃,nunit,sitecore,glass-mapper,Nunit,Sitecore,Glass Mapper,我们一直在用codeflood测试我们的Sitecore代码,但想做更多的工作来自动化我们在本地和CI构建上的测试。我一直在遵循Mike Edwards关于如何使用NUNIT运行Sitecore测试的解决方案- 后来,Dan Solovay发表了一些关于如何改进的想法- 到目前为止,这在VisualStudio构建中非常有效。Config从Sitecore网站复制到测试项目,NUNIT可以执行从Sitecore检索项目的测试,所有这些都不需要上下文 我的问题-我们使用玻璃映射器进行以

我们一直在用codeflood测试我们的Sitecore代码,但想做更多的工作来自动化我们在本地和CI构建上的测试。我一直在遵循Mike Edwards关于如何使用NUNIT运行Sitecore测试的解决方案-

后来,Dan Solovay发表了一些关于如何改进的想法-

到目前为止,这在VisualStudio构建中非常有效。Config从Sitecore网站复制到测试项目,NUNIT可以执行从Sitecore检索项目的测试,所有这些都不需要上下文

我的问题-我们使用玻璃映射器进行以下操作:

Database database = global::Sitecore.Configuration.Factory.GetDatabase("master");
ISitecoreService SitecoreService = new SitecoreService(database);

var catalogItem = database.GetItem([guid to our item]);
Assert.IsNotNull(catalogItem);

var catalog = SitecoreService.CreateType<ProductCatalog>(catalogItem, true, true);
Assert.NotNull(catalog);
Assert other things on our ProductCatalog class...
Database Database=global::Sitecore.Configuration.Factory.GetDatabase(“master”);
ISitecoreService SitecoreService=新的SitecoreService(数据库);
var catalogItem=database.GetItem([guid to our item]);
Assert.IsNotNull(catalogItem);
var catalog=SitecoreService.CreateType(catalogItem,true,true);
Assert.NotNull(目录);
在ProductCatalog类上断言其他内容。。。
问题似乎是Glass Mapper的SitecoreService构造函数需要一个上下文,如果没有上下文,它将使用“Default”。由于我们在NUNIT中执行,因此没有上下文,Sitecore服务的创建失败

我怀疑是否有一个明确的答案可以解决这个问题,但我会对任何人的想法感兴趣


如果没有Sitecore上下文,在测试中使用Glass Mapper可能是不可能的。另一方面,我绝不是玻璃专家-也许在测试中映射我的类有不同的方法?

玻璃SitecoreService和SitecoreContext都有接口,您的测试应该使用类似或的模拟框架模拟这些接口。例如,使用NSubstitute:

var product = new ProductCatalog();  
product.Title = "Hello world";  

ISitecoreService service = Substitute.For<ISitecoreService();
service.GetItem([Guid]).Returns(product);

var result = service.GetItem([Guid]);

Assert.AreEqual("Hello world", result.Title);
var product=new ProductCatalog();
product.Title=“Hello world”;

ISitecoreService service=Substitute.ForThanks!我要试一试——这是有道理的。关于测试玻璃与我们的业务逻辑,我听到了。测试实际上更长,测试ProductCatalog的逻辑。如果有一个更大的代码示例,情况会更清楚。非常感谢。我以为我明白了,但我错了。。。如果我模拟Sitecore服务,我实际上无法从Sitecore映射项目。如果我不能映射它,我就不能在ProductCatalog中测试业务逻辑。我原以为可以通过编程方式设置产品(我的ProductCatalog实例)的属性,但service.GetItem的结果是NSubstitute.Core.ConfiguredCall,而我期望的是ProductCatalog。我只是想这一切都错了吗?您不应该希望在单元测试中从Sitecore中提取一个项,因为这将成为一个集成测试。在单元测试中,将期望从sitecore提取的值分配给ProductCatalog类的实例。我已经更新了上面的例子来说明这一点;知道了!我昨天尝试了这个,但是缺少var result=service.GetItem([Guid]);我试图将结果设置为等于service.GetItem([Guid]).Returns(product)。现在的大任务是获取所有TDS/Sitecore测试数据,并将其移动到可管理的设置和拆卸例程中。谢谢迈克尔·爱德华兹。