1

我们一直在使用 codeflood 测试我们的 Sitecore 代码,但希望做更多的事情来自动化我们对本地和 CI 构建的测试。我一直在关注 Mike Edwards 提出的关于如何使用 NUNIT 运行 Sitecore 测试的解决方案 -

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

到目前为止,这在视觉工作室构建中效果很好。配置从 Sitecore 网站复制到测试项目,NUNIT 可以执行从 Sitecore 检索项目的测试,所有这些都没有上下文。

我的问题 - 我们使用 Glass Mapper 来处理这样的事情:

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...

问题似乎是 Glass Mapper 的 SitecoreService 构造函数需要一个上下文,如果没有,它使用“默认”。由于我们在 NUNIT 中执行,因此没有上下文,并且 Sitecore 服务的创建失败。

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

如果没有 Sitecore 上下文,也许无法在测试中使用 Glass Mapper。另一方面,我绝不是 Glass 专家——也许有不同的方法可以在测试中映射我的班级?

4

1 回答 1

2

Glass SitecoreService 和 SitecoreContext 都有接口,您的测试应该使用NSubstituteMOQ等模拟框架来模拟此接口。例如使用 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);

您上面的测试似乎是在测试 Glass 是否返回项目,而不是测试应用程序的业务逻辑。你应该避免这些类型的测试。

于 2014-07-10T07:31:15.273 回答