【问题标题】:Access Sitecore context in Unit test project在单元测试项目中访问 Sitecore 上下文
【发布时间】:2016-06-25 01:53:16
【问题描述】:

我想访问 MS Test Project 中的 sitecore 上下文。 我正在使用 Sitecore 8.1 和使用 VS 2005 的 MS 测试项目(框架:4.5.2) 我遵循了这里的一些说明http://getfishtank.ca/blog/unit-testing-in-sitecore-with-context-and-app-config

所以我的单元测试项目中有所有必需的 DLLS 和 sitecore 配置文件。

我的代码如下:

    [TestMethod]
    public void TestMethod1()
    {
        State.HttpRuntime.AppDomainAppPath = Directory.GetCurrentDirectory();

        string dataFolder = Sitecore.Configuration.Settings.DataFolder;
        string licenseFile = Settings.LicenseFile;

        var db = Sitecore.Configuration.Factory.GetDatabase("master");
        var home = db.GetItem("/sitecore/content/");
        Assert.AreEqual(5, 5);
    }

现在我收到以下错误:

        Result StackTrace:  
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
       at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
       at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
       at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
       at System.Reflection.Assembly.LoadFrom(String assemblyFile)
       at Sitecore.Reflection.ReflectionUtil.LoadAssembly(String name)
       at Sitecore.Reflection.ReflectionUtil.CreateObject(String assembly, String className, Object[] parameters)
       at Sitecore.Reflection.ReflectionUtil.CreateObject(String typeName, Object[] parameters)
       at Sitecore.Reflection.Nexus.GetApi[T](String typeName, T& api)
       at Sitecore.SecurityModel.License.LicenseManager.GetSnapshotData(Guid instance)
       at Sitecore.SecurityModel.License.LicenseManager.UpdateSnapshot()
       at Sitecore.SecurityModel.License.LicenseManager..cctor()
     --- End of inner exception stack trace ---
        at Sitecore.SecurityModel.License.LicenseManager.DemandRuntime(Boolean acceptExpress)
       at Sitecore.Data.Managers.ItemManager.get_Provider()
       at Sitecore.Data.Managers.ItemManager.GetItem(String itemPath, Language language, Version version, Database database)
       at Sitecore.Data.Database.GetItem(String path)
       at MSUnitTestSitecore.UnitTest1.TestMethod1() in C:\Devarea_Debajit\MyProjects\MSUnitTestSitecore\MSUnitTestSitecore\UnitTest1.cs:line 20
    Result Message: 
    Test method MSUnitTestSitecore.UnitTest1.TestMethod1 threw exception: 
    System.TypeInitializationException: The type initializer for 'Sitecore.SecurityModel.License.LicenseManager' threw an exception. ---> System.IO.FileLoadException: Could not load file or assembly 'file:///C:\Devarea_Debajit\MyProjects\MSUnitTestSitecore\MSUnitTestSitecore\bin\Debug\Sitecore.Nexus.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515) ---> System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.

我已检查许可证文件路径及其正确性。 我也加了这个

 <runtime>
    <loadFromRemoteSources enabled="true"/>
 </runtime>

谁能帮帮我?

【问题讨论】:

    标签: c# unit-testing sitecore sitecore8


    【解决方案1】:

    为了使用 Sitecore.Context 进行单元测试,您需要将所有 Sitecore 配置从 App_Config 复制到您的单元测试项目中,并复制 web.config 并将其重命名为 app.config。您可以在此处找到更详细的演练:http://getfishtank.ca/blog/unit-testing-in-sitecore-with-context-and-app-config

    不过,我建议您使用Sitecore FakeDb 来运行您的单元测试。这将使您能够更好地隔离您的测试,而无需依赖正在运行的 Sitecore 实例/数据库,并允许执行更多受控测试,因为数据不会因更新而不断变化。

    【讨论】:

    • 我已按照以下说明进行操作:1)将 web.config 重命名为 app.config 2)包括 App_Config 文件夹下的所有配置文件 3)包括所有 dll 但我仍然遇到相同的错误。 Sitecore fake DB 将无法正常工作,因为我们还想测试实际内容。更新版本的 sitecore 是否会发生这种情况?我正在使用 Sitecore 8.1 更新 1。
    • @DebajitMukherjee 当你说 FakeDB 不起作用时?你的意思是?我们使用它很棒。您在 TDS 中有内容吗?如果你这样做,你可以使用hermanussen.eu/sitecore/wordpress/2014/09/…
    【解决方案2】:

    你好,德巴吉特·穆克吉,

    我陷入了同样的情况,我的模块与 Sitecore.Context 信息紧密耦合。所以,我想在我的测试中使用 Sitecore.Context。

    您可以在下面找到有关如何实现它的更多信息。 https://pratiksatikunvar.wordpress.com/2016/04/04/unit-testing-in-sitecore-using-nunit-with-sitecore-context-information/

    希望对你有帮助。

    如果需要进一步说明,请告诉我。

    谢谢

    【讨论】:

      【解决方案3】:

      这可能与您的情况无关,但我遇到了一个非常相似的问题,最终发现这是因为 Sitecore.Nexus DLL 被阻止了。

      在我的例子中,我从我的测试项目中删除了对 Sitecore.Nexus 的引用,解除了对 DLL 的阻止,重新添加了引用,一切都很好。

      有关解锁 DLL 的详细信息,请参阅:http://www.limilabs.com/blog/unblock-dll-file

      【讨论】:

        猜你喜欢
        • 2018-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多