0

そのため、私はSitecoreを初めて使用し、これを有効にする方法が正確にはわかりません。サーバーAにSitecoreをインストールしていて、サーバーBから単体テストを実行しています。ただし、API(Sitecore.Kernel.dll内)を介してリモートでSitecoreにアクセスする際に問題が発生しています。

  1. Sitecoreのインストールが正しくセットアップされ、CMS管理者にアクセスしたり、アイテムを追加したり、データベースを表示したりできます。
  2. 以下のスタックトレースから、データフォルダーを探していることがわかります(サーバーBには存在せず、サーバーAのSitecoreインストールの一部です)。
  3. ライセンスはこのディレクトリ(データフォルダ)に保存され、失敗した呼び出しコードはLicenseManagerと呼ばれるため、何かがライセンスを検証しようとしていると推測されます。
  4. 以下の参照リンクで指定されているように、単体テストをセットアップしました。これで私の設定の具体的な詳細がすべてわかりました(ただし、気軽に質問してください)。

質問:別のサーバーから(理想的にはdllのSitecore APIを介して)Sitecoreインストールに対して単体テストを実行するようにこれを設定する方法はありますか?

参照:

テストコードの例:

    [TestMethod]
    public void GetItemTest()
    {
        var database = global::Sitecore.Configuration.Factory.GetDatabase("master");
        Assert.IsNotNull(database);

        var item = database.GetItem("/sitecore/content");
        Assert.IsNotNull(item);
        Assert.AreEqual("content", item.Name);
    }

例外:

System.TypeInitializationException was unhandled by user code
  Message=The type initializer for 'Sitecore.SecurityModel.License.LicenseManager' threw an exception.
  Source=Sitecore.Kernel
  TypeName=Sitecore.SecurityModel.License.LicenseManager
  StackTrace:
       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 Spacely.Web.Tests.Services.SitecoreServiceTest.GetItemTest() in C:\Users\foo\src\spacely\Spacely.Web.Tests\Services\SitecoreServiceTest.cs:line 25
  InnerException: System.Reflection.TargetInvocationException
       Message=Exception has been thrown by the target of an invocation.
       Source=mscorlib
       StackTrace:
            at System.RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo method, Object[] args, SignatureStruct& signature, RuntimeType declaringType)
            at System.RuntimeMethodHandle.InvokeConstructor(IRuntimeMethodInfo method, Object[] args, SignatureStruct signature, RuntimeType declaringType)
            at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
            at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
            at Sitecore.Reflection.ReflectionUtil.CreateObject(Type type, Object[] parameters)
            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.Reflection.Nexus.get_LicenseApi()
            at Sitecore.SecurityModel.License.LicenseManager.GetSnapshotData(Guid instance)
            at Sitecore.SecurityModel.License.LicenseManager.UpdateSnapshot()
            at Sitecore.SecurityModel.License.LicenseManager..cctor()
       InnerException: System.ArgumentException
            Message=The directory name \data is invalid.
            Source=System
            StackTrace:
                 at System.IO.FileSystemWatcher.set_Path(String value)
                 at Sitecore.IO.FileWatcher.InitializeWatcher(String filter, String folder)
                 at Sitecore.IO.FileWatcher..ctor(String folder, String filter)
                 at Sitecore.SecurityModel.License.LicenseWatcher..ctor()
                 at Sitecore.Nexus.Licensing.NexusLicenseApi.()
                 at Sitecore.Nexus.Licensing.NexusLicenseApi..ctor()
            InnerException: 
4

2 に答える 2

3

私はユニットテストに関するいくつかのブログ投稿を書きました、静かな古いものがありますが、それでも適用されます:

http://www.experimentsincode.com/?p=232

DanSoloveyのブログもご覧ください。

http://www.dansolovay.com/search/label/TDD

于 2013-03-07T07:34:02.233 に答える
2

Sitecore APIは「別のサーバーへ」を呼び出すことができないため、少なくともここで行っている方法では、説明したアーキテクチャは不可能です。リンク先の記事では、Sitecoreを使用してWebサーバーとは独立して実行される単体テストプロジェクトを設定する方法について説明しています。つまり、実際にはWebコンテキストの外部でSitecoreを実行します。これは可能ですが、少し手間がかかる場合があります。必要なセットアップの一部は、単体テストを実行しているサーバーにsitecoreライセンスを配置し、App.configのdataFolderをその場所にポイントすることです。

別の方法は、Webハーネスを使用して単体テストを実行することですが、これはおそらく、探している自動化されたソリューションではありません。このソリューションはGitHubでも利用できます。私たちがしばらくの間持っていたアイデアの1つは、Webサービスを介してリモートテストハーネスを呼び出すことです。これは、リモートサーバーからテストを実行するという目標を達成するための1つの方法です。

于 2013-03-06T22:39:37.793 に答える