Sharepoint 2010 アプリケーションの単体テストを分離するためのエミュレーターの使用Using emulators to isolate unit tests for Sharepoint 2010 applications

Microsoft.SharePoint.Emulators パッケージには、Microsoft SharePoint 2010 アプリケーションの分離単体テストの作成に役立つ一連のライブラリが用意されています。The Microsoft.SharePoint.Emulators package provides a set of libraries that help you to create isolated unit tests for Microsoft SharePoint 2010 applications. エミュレーターは、Microsoft Fakes 分離フレームワークで shim を使用して、SharePoint API の最も一般的なオブジェクトおよびメソッドを模倣する、軽量なメモリ内オブジェクトを作成します。Emulators use shims from the Microsoft Fakes isolation framework to create lightweight in-memory objects that mimic the most common objects and methods of the SharePoint API. SharePoint メソッドがエミュレートされていない場合、またはエミュレーターの既定の動作を変更する場合は、Fakes shim を作成して必要な結果を提供できます。When a SharePoint method is not emulated, or when you want to change the default behavior of an emulator, you can create Fakes shims to provide the results that you want.

既存のテスト メソッドとクラスは、エミュレーターのコンテキストで実行されるように容易に変換できます。Existing test methods and classes can be easily converted to run in the Emulator context. この機能を使用すると、二重用途のテストを作成できます。This capability lets you create dual-use tests. 二重用途のテストは、実際の SharePoint API に対する統合テストと、エミュレーターを使用する分離単体テストを切り替えることができます。A dual-use test can toggle between integration tests against the real SharePoint API and isolated unit tests that use the emulators.

このトピックの内容In this topic

RequirementsRequirements

AppointmentsWebPart の例The AppointmentsWebPart example

既存のテストを変換するConverting an existing test

要件Requirements

  • Microsoft SharePoint 2010 (SharePoint 2010 Server または SharePoint 2010 Foundation)Microsoft SharePoint 2010 (SharePoint 2010 Server or SharePoint 2010 Foundation)

  • Microsoft Visual Studio EnterpriseMicrosoft Visual Studio Enterprise

  • Microsoft SharePoint Emulators NuGet パッケージMicrosoft SharePoint Emulators NuGet package

    また、Visual Studio での単体テストの基本をよく理解しておく必要があるほか、Microsoft Fakes に関する知識も必要です。You should also be familiar with the basics of unit testing in Visual Studio and some knowledge of Microsoft Fakes.

AppointmentsWebPart の例The AppointmentsWebPart example

AppointmentsWebPart を使用すると、予定の SharePoint リストを表示および管理できます。The AppointmentsWebPart lets you view and manage a SharePoint list of your appointments.

予定 Web パーツAppointments Web Part

この例では、Web パーツの 2 つのメソッドをテストします。We'll test two methods of the web part in this example:

  • ScheduleAppointment メソッドは、自身に渡されたリスト項目の値を検証し、指定された SharePoint Web にある一覧に新しいエントリを作成します。The ScheduleAppointment method validates the list item values passed to the method and creates a new entry in a list on a specified SharePoint web.

  • GetAppointmentsForToday メソッドは、今日の予定の詳細を返します。The GetAppointmentsForToday method returns the details of today's appointments.

    このトピックの内容In this topic

既存のテストを変換するConverting an existing test

SharePoint コンポーネントの一般的なメソッド テストでは、テスト メソッドにより、一時的なサイトが SharePoint Foundation に作成され、テスト対象のコードが必要とする SharePoint コンポーネントが追加されます。In a typical test of a method in a SharePoint component, the test method creates a temporary site in SharePoint Foundation and adds the SharePoint components to the site that the code under test requires. その後、コンポーネントのインスタンスが作成および実行されます。The test method then creates and exercises an instance of the component. このサイトは、テストの終了時に破棄されます。At the end of the test, the site is torn down.

テスト対象のコードの ScheduleAppointment メソッドは、ほとんどの場合、そのコンポーネントに対して記述された最初のメソッドの 1 つです。The ScheduleAppointment method of our code under test is probably one of the first methods written for the component:

// method under test  
public bool ScheduleAppointment(SPWeb web, string listName, string name,   
    string phone, string email, string age, DateTime date, out string errorMsg)  
{  
    errorMsg = string.Empty;  
    var badFormat = this.checkInput(name, phone, email, age);  
    if (badFormat)  
    {  
        errorMsg = "Bad Format";  
        return false;  
    }  
    var exists = this.CheckDuplicate(listName, web, name, phone, email, age, date);  
    if (exists)  
    {  
        errorMsg = "Item already exists";  
        return false;  
    }  
    SPListItemCollection items = web.Lists[listName].Items;  
    // create item and populate fields  
    SPListItem item = items.Add();  
    item["Name"] = name;  
    item["Phone"] = phone;  
    item["Email"] = email;  
    item["Age"] = age;  
    item["Date"] = date.ToString("D");  
    item.Update();  
    return true;  
}  

ScheduleAppointment メソッドの機能の最初のテストは次のようになります。The first test of the functionality in ScheduleAppointment method might look like this:


[TestMethod]  
public void ScheduleAppointmentReturnsTrueWhenNewAppointmentIsCreated()  
{  
    using( var site = new SPSite("http://localhost"))  
    using (var webPart = new BookAnAppointmentWebPart())  
    {  
        // Arrange  
        string errorMsg = string.Empty;  
        DateTime date = DateTime.Now;  
        SPList list = AddListToSiteHelper(site);  

        // Act  
        bool success = webPart.ScheduleAppointment(site.RootWeb, list.Title,  
            "Raisa Pokrovskaya", "425-555-0163", "raisa@outlook.com", "55", date,   
            out errorMsg);  
        list.Delete();  

        // Assert  
        Assert.IsTrue(success);  
    }  
}  

このテスト メソッドは、ScheduleAppointment メソッドによって新しいエントリが一覧に適切に追加されたかどうかを検証しますが、コードの特定の動作のテストというよりも、どちらかというと Web パーツの統合テストです。Although this test method does verify that the ScheduleAppointment method correctly adds a new entry to the list, it is more an integration test of the web part than a test of the specific behavior of your code. このテストは、SharePoint および SharePoint API に対する外部依存関係によって、ScheduleAppointment メソッドのユーザー コード以外の理由で失敗することがあります。The external dependencies to SharePoint and the SharePoint API can cause the test to fail for reasons other than the user code in the ScheduleAppointment method. また、SharePoint サイトの作成および破棄のオーバーヘッドによりテストが遅くなりすぎて、コード プロセスの一部として実行できなくなることもあります。The overhead in creating and destroying the SharePoint site can also make the test too slow to run as a regular part of the coding process. すべてのテスト メソッドに対してサイトの設定と破棄を実行しても、効率的な開発者単体テストの作成に関する問題を悪化させるだけです。Performing the setup and destruction of the site for every test method only compounds the problem of creating efficient developer unit tests.

Microsoft SharePoint エミュレーターは、よく使用する SharePoint API の動作を模倣する一連のオブジェクトとメソッド "doubles" を提供します。Microsoft SharePoint emulators give you a set of object and method "doubles" that mimic the behavior of the most common SharePoint APIs. エミュレートされたメソッドは SharePoint API の軽量な実装で、SharePoint を実行する必要がありません。The emulated methods are lightweight implementations of the SharePoint API that do not require SharePoint to run. Microsoft Fakes を使用して、SharePoint API への呼び出しを、SharePoint エミュレーターのメソッド doubles に迂回させることで、テストを分離して、必要なコードをテストしているかどうかを確認します。By using Microsoft Fakes to detour calls to the SharePoint API to the method doubles of SharePoint Emulators, you isolate your tests and make sure that you are testing the code you want. エミュレートされていない SharePoint のメソッドを呼び出すと、Fake を使用して必要な動作を直接作成できます。When you call SharePoint methods that are not emulated, you can use Fakes directly to create the desired behavior.

このトピックの内容In this topic

テスト プロジェクトに Emulators パッケージを追加するAdding the Emulators package to a test project

SharePoint エミュレーターをテスト プロジェクトに追加するには:To add the SharePoint emulators to a test project:

  1. ソリューション エクスプローラーでテスト プロジェクトを選択します。Select the test project in Solution Explorer.

  2. ショートカット メニューの [NuGet パッケージの管理...] を選択します。Choose Manage NuGet Packages ... on the shortcut menu.

  3. Microsoft.SharePoint.Emulators[オンライン] カテゴリを検索し、[インストール] を選択します。Search the Online category for Microsoft.SharePoint.Emulators, and then choose Install.

    SharePoint エミュレーター NuGet パッケージSharepoint Emulators NuGet package

    このトピックの内容In this topic

エミュレーションを使用してテスト メソッドを実行するRunning a test method with emulation

パッケージをインストールすると、必要なライブラリへの参照がプロジェクトに追加されます。Installing the package adds references to the required libraries to your projects. 既存のテスト クラスでエミュレーターを使いやすくするには、名前空間 Microsoft.SharePoint.EmulatorsMicrosoft.QualityTools.Testing.Emulators を追加します。To make it easy to use emulators in an existing test class, add the namespaces Microsoft.SharePoint.Emulators and Microsoft.QualityTools.Testing.Emulators.

テスト メソッドでエミュレーションを有効にするには、using オブジェクトを作成する SharePointEmulationScope ステートメントでメソッド本体をラップします。To enable emulation in your test methods, wrap the method body in a using statement that creates a SharePointEmulationScope object. 例:For example:


[TestMethod]  
public void ScheduleAppointmentReturnsTrueWhenNewAppointmentIsCreated()  
{  
    // create the emulation scope with a using statement  
    using (new SharePointEmulationScope())  
    using( var site = new SPSite("http://localhost"))  
    using (var webPart = new BookAnAppointmentWebPart())  
    {  
        // Arrange  
        string errorMsg = string.Empty;  
        DateTime date = DateTime.Now;  
        SPList list = AddListToSiteHelper(site);  

        // Act  
        bool success = webPart.ScheduleAppointment(site.RootWeb, list.Title,  
            "Raisa Pokrovskaya", "425-555-0163", "raisa@outlook.com", "55", date,   
            out errorMsg);  
        list.Delete();  

        // Assert  
        Assert.IsTrue(success);  
    }  
}  

テスト メソッドが実行されると、エミュレーター ランタイムは、Microsoft Fake を呼び出してコードを SharePoint メソッドに動的に挿入し、これらのメソッドへの呼び出しを、Microsoft.SharePoint.Fakes.dll で宣言されているデリゲートに迂回させます。When the test method is executed, the Emulator runtime calls Microsoft Fakes to dynamically inject code into SharePoint methods to divert the calls to these methods to delegates that are declared in Microsoft.SharePoint.Fakes.dll. Microsoft.SharePoint.Emulators.dll は、エミュレートされたメソッドのデリゲートを実装し、SharePoint の実際の動作を正確に模倣します。Microsoft.SharePoint.Emulators.dll implements the delegates for emulated methods, closely mimicking the actual SharePoint behavior. テスト メソッドまたはテスト対象のコンポーネントが SharePoint メソッドを呼び出した結果として生じる動作は、エミュレーションの動作です。When the test method or the component under test calls a SharePoint method, the behavior that results is that of the emulation.

エミュレーターの実行フローEmulator execution flow

このトピックの内容In this topic

二重用途のクラスおよびメソッドを作成するCreating dual-use classes and methods

実際の SharePoint API に対する統合テストと、エミュレーターを使用する分離単体テストの両方に使用できるメソッドを作成するには、オーバーロードされたコンストラクター SharePointEmulationScope(EmulationMode) を使用して、テスト メソッド コードをラップします。To create methods that can be used for both integration tests against the real SharePoint API and isolated unit tests that use emulators, use the overloaded constructor SharePointEmulationScope(EmulationMode) to wrap your test method code. EmulationMode 列挙型の 2 つの値は、スコープがエミュレーターを使用するかどうか (EmulationMode.Enabled)、またはスコープが SharePoint API を使用するかどうか (EmulationMode.Passthrough) を指定します。The two values of the EmulationMode enum specify whether the scope uses emulators (EmulationMode.Enabled) or whether the scope uses the SharePoint API (EmulationMode.Passthrough).

たとえば、次のコードは、前回のテストを二重用途に変更する方法を示しています。For example, here's how you can modify the previous test to be dual-use:


// class level field specifies emulation mode  
private const EmulationMode emulatorMode = EmulationMode.Enabled;  

[TestMethod]  
public void ScheduleAppointmentReturnsTrueWhenNewAppointmentIsCreated()  
{  
    // emulation scope determined by emulatorMode  
    using( SharePointEmulationScope(emulatorMode))  
    using( var site = new SPSite("http://localhost"))  
    using (var webPart = new BookAnAppointmentWebPart())  
    {  
        // Arrange  
        string errorMsg = string.Empty;  
        DateTime date = DateTime.Now;  
        SPList list = AddListToSiteHelper(site);  

        // Act  
        bool success = webPart.ScheduleAppointment(site.RootWeb, list.Title,  
            "Raisa Pokrovskaya", "425-555-0163", "raisa@outlook.com", "55", date,   
            out errorMsg);  
        list.Delete();  

        // Assert  
        Assert.IsTrue(success);  
    }  
}  

このトピックの内容In this topic

TestInitialize 属性と TestCleanup 属性を使用して二重用途のテスト クラスを作成するUsing TestInitialize and TestCleanup attributes to create a dual-use test class

SharePointEmulationScope を使用してクラスのすべてのテスト、またはほとんどのテストを実行すると、クラス レベルの手法を利用して、エミュレーション モードを設定できます。If you run all or most of the tests in a class using SharePointEmulationScope, you can take advantage of class-level techniques to set the emulation mode.

  • <xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute> および <xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute> を使用して属性設定されているテスト クラス メソッドが、スコープを作成および破棄できます。Test class methods that attributed with <xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute> and <xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute> can create and destroy the scope.

  • クラス レベルで EmulationMode を設定すると、EmulationMode.Enabled および EmulationMode.Passthrough の間のモード変更を自動化できます。Setting the EmulationMode at the class level can let you automate the mode change between EmulationMode.Enabled and EmulationMode.Passthrough.

    [TestInitialize] を使用して属性設定されているクラス メソッドが、各テスト メソッドの開始時に実行され、[TestCleanup] を使用して属性設定されているメソッドが、各テスト メソッドの終了時に実行されます。A class method that is attributed with [TestInitialize] is run at the start of each test method and a method that is attributed with [TestCleanup] runs at the end of each test method. クラス レベルで SharePointEmulationScope オブジェクトのプライベート フィールドを宣言し、TestInitialize 属性付きメソッドで初期化して、TestCleanup 属性付きメソッドでオブジェクトを破棄できます。You can declare a private field for the SharePointEmulationScope object at the class level, initialize it in the TestInitialize attributed method, and then dispose of the object in the TestCleanup attributed method.

    任意のメソッドを選択して使用し、EmulationModeの選択を自動化できます。You can use any method that you choose to automate the selection of the EmulationMode. 1 つは、プリプロセッサ ディレクティブを使用してシンボルの存在をチェックする方法です。One way is to check for the existence of a symbol by using preprocessor directives. たとえば、エミュレーターを使用してクラスでテスト メソッドを実行するために、テスト プロジェクト ファイルまたはビルド コマンド ラインで USE_EMULATION などのシンボルを定義できます。For example, to run the test methods in a class using emulators, you can define a symbol such as USE_EMULATION in the test project file or on the build command line. シンボルを定義すると、クラス レベルの EmulationMode 定数が宣言され、Enabled に設定されます。If the symbol is defined, a class level EmulationMode constant is declared and set to Enabled. それ以外の場合、定数は Passthrough に設定されます。Otherwise, the constant is set to Passthrough.

    次のテスト クラスの例は、プリプロセッサ ディレクティブ、TestInitialize 属性付きメソッド、および TestCleanup 属性付きメソッドを使用して、エミュレーション モードを設定する方法を示しています。Here's an example of the test class that demonstrates how to use preprocessor directives and the TestInitialize and TestCleanup attributed methods to set the emulation mode.

//namespace declarations  
...  

namspace MySPAppTests   
{  
    [TestClass]  
    public class BookAnAppointmentWebPartTests  
    {  

        // emulationScope is a class level field  
        private SharePointEmulationScope emulationScope;  

        // preprocessor directives determine the value of emulatorMode  
        #if USE_EMULATIONprivate const EmulationMode emulatorMode = EmulationMode.Enabled;#elseprivate const EmulationMode emulatorMode = EmulationMode.Passthrough;#endif  

        // InitializeTest sets the emulation scope at the beginning of each test method  
        [TestInitialize]public void InitializeTest(){this.emulationScope = new SharePointEmulationScope(emulatorMode);}  

        // CleanupTest disposes the emulation scope at the end of each test method  
        [TestCleanup]public void CleanupTest(){this.emulationScope.Dispose();}  

        [TestMethod]  
        public void ScheduleAppointmentReturnsTrueWhenNewAppointmentIsCreated()  
        {  
            // remove the SharePointEmulationScope using statement from the method  
            using( var site = new SPSite("http://localhost"))  
            using (var webPart = new BookAnAppointmentWebPart())  
            {  
                // Arrange  
                string errorMsg = string.Empty;  
                DateTime date = DateTime.Now;  
                SPList list = AddListToSiteHelper(site);  

                // Act  
                bool success = webPart.ScheduleAppointment(site.RootWeb, list.Title,  
                    "Raisa Pokrovskaya", "425-555-0163", "raisa@outlook.com", "55", date,   
                    out errorMsg);  
                list.Delete()  

                // Assert  
                Assert.IsTrue(success);  
            }  
        }  

        ...// More tests  

    }  
}  

このトピックの内容In this topic

エミュレートされていない SharePoint メソッドを処理するHandling non-emulated SharePoint methods

すべての SharePoint 型がエミュレートされるわけではありません。また、エミュレートされた型のすべてのメソッドがエミュレートされるわけでもありません。Not all SharePoint types are emulated, and not all methods in some emulated types are emulated. テスト対象のコードが、エミュレートされていない SharePoint メソッドを呼び出すと、そのメソッドによって NotSupportedException 例外がスローされます。If the code under test calls a SharePoint method that is not emulated, the method throws a NotSupportedException exception. 例外が発生したら、SharePoint メソッドの Fakes shim を追加します。When an exception occurs, you add a Fakes shim for the SharePoint method.

SharePoint Fakes の準備Setting up Sharepoint Fakes

Microsoft Fakes shim を明示的に呼び出すには:To explicitly call Microsoft Fakes shims:

  1. エミュレートされていない SharePoint クラスに shim を使用する場合は、Microsoft.SharePoint.fakes ファイルを編集し、shim が使用されたクラスの一覧にそのクラスを追加します。If you want to shim a SharePoint class that is not emulated, edit the Microsoft.SharePoint.fakes file and add the class to the list of shimmed classes. Microsoft Fakes におけるコード生成、コンパイル、および名前付け規則」の stub と shim のコード生成の構成に関するセクションを参照してください。See the Configuring code generation of stubs and shims section of Code generation, compilation, and naming conventions in Microsoft Fakes.

    ソリューション エクスプローラーの Fakes フォルダーFakes folder in Solution Explorer

  2. Microsoft SharePoint エミュレーター パッケージのインストール後、Microsoft.SharePoint.Fakes ファイルを編集した場合、少なくとも 1 回はテスト プロジェクトをリビルドします。Rebuild the test project at least once after you have installed the Microsoft SharePoint Emulators package and if you have edited the Microsoft.SharePoint.Fakes file. プロジェクトをビルドすると、ディスク上のプロジェクト ルート フォルダーに FakesAssembly フォルダーが作成され、設定されます。Building the project creates and populates a FakesAssembly folder in your on-disk project root folder.

    FakesAssembly フォルダーFakesAssembly folder

  3. FakesAssembly フォルダーにある Microsoft.SharePoint.14.0.0.0.Fakes.dll アセンブリに参照を追加します。Add a reference to the Microsoft.SharePoint.14.0.0.0.Fakes.dll assembly that is located in the FakesAssembly folder.

  4. (省略可能) 名前空間ディレクティブを、使用する Microsoft.QualityTools.Testing.FakesMicrosoft.SharePoint.Fakes、および Microsoft.SharePoint.Fakes の入れ子になった名前空間のテスト クラスに追加します。(Optional) Add a namespace directive for to the test class for Microsoft.QualityTools.Testing.Fakes, Microsoft.SharePoint.Fakes and any nested namespace of Microsoft.SharePoint.Fakesthat you want to use.

    SharePoint メソッドの shim デリゲートの実装Implementing the shim delegate for a SharePoint method

    この例のプロジェクトでは、GetAppointmentsForToday メソッドは SPList.GetItems (SPQuery) SharePoint API メソッドを呼び出しています。In our example project, the GetAppointmentsForToday method calls the SPList.GetItems(SPQuery) SharePoint API method.

// method under test  
public string GetAppointmentsForToday(string listName, SPWeb web)  
{  
    SPList list = web.Lists[listName];  
    DateTime today = DateTime.Now;  
    var listQuery = new SPQuery{Query = String.Format("<Where><Eq><FieldRef Name='Date'/>" +"<Value Type='Text'>{0}</Value>" +"</Eq></Where>", today.ToString("D"))};  
    var result = new System.Text.StringBuilder();  
    foreach (SPListItem item in list.GetItems(listQuery))  
    {  
        result.AppendFormat("Name: {0}, Phone: {1}, Email: {2}, Age: {3}, Date: {4}\n",   
            item["Name"], item["Phone"], item["Email"], item["Age"], item["Date"]);  
    }  
    return result.ToString();  
}  

オーバーロードされた SPList.GetItems(SPQuery) メソッドの GetItems バージョンはエミュレートされません。The SPList.GetItems(SPQuery) version of the overloaded GetItems method is not emulated. したがって、GetAppointmentsForToday では、SharePoint.Emulation.Scope の既存のテストをラップできません。Therefore, just wrapping an existing test for GetAppointmentsForToday in SharePoint.Emulation.Scope would fail. 機能するテストを作成するには、テスト対象の結果を返す Fakes デリゲート ShimSPList.GetItemsSPQuery の実装を記述する必要があります。To create a working test, you have to write an implementation of the Fakes delegate ShimSPList.GetItemsSPQuery that returns the results that you want to test against.

Fakes デリゲートを実装する既存のテスト メソッド GetAppointmentsForTodayReturnsOnlyTodaysAppointments を次のように変更します。Here's a modification of an existing test method, GetAppointmentsForTodayReturnsOnlyTodaysAppointments, that implements a Fakes delegate. 必要な変更については、コメントで説明が示されています。The required changes are called out in comments:

重要

テストが ShimNotSupported コンテキストで実行されると、Fake shim を明示的に作成するテスト メソッドにより EmulationMode.Passthrough 例外がスローされます。Test methods that explicitly create Fakes shims throw a ShimNotSupported exception when the test is run in the EmulationMode.Passthrough context. この問題を回避するには、変数を使用して EmulationMode 値を設定し、値をテストする if ステートメントで Fakes コードをラップします。To avoid this issue, use a variable to set the EmulationMode value and wrap any Fakes code in an if statement that tests the value.

// class level field to set emulation mode  
private const EmulationMode emulatorMode = EmulationMode.Enabled  

[TestMethod]  
public void GetAppointmentsForTodayReturnsOnlyTodaysAppointments()  
{  

    // create the emulation scope with a using statement  
    using (var emulationScope = new SharePointEmulationScope(emulatorMode))  
    using( var site = new SPSite("http://localhost"))  
    using (var webPart = new BookAnAppointmentWebPart())  
    {  
        // Arrange  
        DateTime date = DateTime.Now;  
        SPList list = AddListToSiteHelper(site);  
        // insert 2 items into list  
        AddItemsToListHelper(list, new string[] {"Raisa Pokrovskaya", "425-555-0163",  
            "raisa@outlook.com", "55", date.ToString("D") });  
        AddItemsToListHelper(list, new string[] {"Francis Totten", "313-555-0100",  
            "francis@contoso.com", "42", date.AddDays(1).ToString("D") });  

        // use Fakes shims only if emulation is enabled  
        if (emulatorMode == EmulationMode.Enabled){var sList = new ShimSPList(list);sList.GetItemsSPQuery = (query) =>{var shim = new ShimSPListItemCollection();shim.Bind(new[] { list.Items[0] });return shim.Instance;}}  

        // Act  
        string result = webPart.GetAppointmentsForToday(list.Title, site.RootWeb);  
        list.Delete();  

        // Assert  
        Assert.IsTrue(result.Contains(String.Format(  
            "Name: Raisa Pokrovskaya, Phone: 425-555-0163, Email: raisa@outlook.com," +  
            "Age: 55, Date: {0}", date.ToString("D"))));  
        Assert.IsFalse(result.Contains("Name: Francis Totten"));  
    }  
}  

このメソッドでは、最初に、エミュレーションが有効になっていることをテストします。In this method, we first test that emulation is enabled. 有効になっている場合は、SPList リストに対して Fakes shim オブジェクトを作成してから、メソッドを作成して、その GetItemsSPQuery デリゲートに割り当てます。If it is, we create a Fakes shim object for our SPList list and then create and assign a method to its GetItemsSPQuery delegate. デリゲートは Fake Bind メソッドを使用して、呼び出し元に返される ShimSPListItemCollection に正しいリスト項目を追加します。The delegate uses the Fakes Bind method to add the correct list item to the ShimSPListItemCollection that is returned to the caller.

このトピックの内容In this topic

新しいエミュレーション テストの作成と概要Writing emulation tests from scratch, and a summary

前のセクションで説明したエミュレーション テストおよび二重用途のテストを作成する手法では、既存のテストを変換することを前提としていますが、テストをゼロから記述する手法も使用できます。Although the techniques to create emulation and dual-use tests that are described in the previous sections assume that you are converting existing tests, you can also use the techniques to write tests from scratch. 次の一覧にこの手法の概要を示します。The following list summarizes these techniques:

  • テスト プロジェクトでエミュレーターを使用するには、Microsoft.SharePoint.Emulators NuGet パッケージをプロジェクトに追加します。To use emulators in a test project, add the Microsoft.SharePoint.Emulators NuGet package to the project.

  • テスト メソッドでエミュレーターを使用するには、メソッドの先頭で SharePointEmulationScope オブジェクトを作成します。To use emulators in a test method, create a SharePointEmulationScope object at the beginning of the method. サポートされる SharePoint API はすべて、スコープが破棄されるまでエミュレートされます。All supported SharePoint APIs will be emulated until the scope is disposed.

  • 実際の SharePoint API に記述しているように、テスト コードを記述します。Write your test code as if you were writing it against the real SharePoint API. エミュレーションのコンテキストによって、SharePoint メソッドへの呼び出しはそのメソッドのエミュレーターに自動的に迂回します。The emulation context automatically detours the calls to SharePoint methods to their emulators.

  • すべての SharePoint オブジェクトがエミュレートされるわけではありません。また、エミュレートされたオブジェクトのすべてのメソッドがエミュレートされるわけでもありません。Not all SharePoint objects are emulated, and not all methods of some emulated objects are emulated. エミュレートされていないオブジェクトまたはメソッドを使用すると、NotSupportedException 例外がスローされます。A NotSupportedException exception is thrown when you use a non-emulated object or method. この場合は、そのメソッドに対して Fake shim デリゲートを明示的に作成し、必要な動作を返します。When this occurs, explicitly create a Fakes shim delegate for the method to return the required behavior.

  • 二重用途のテストを作成するには、SharePointEmulationScope(EmulationMode) コンストラクターを使用して、エミュレーション スコープ オブジェクトを作成します。To create dual-use tests, use the SharePointEmulationScope(EmulationMode) constructor to create the emulation scope object. EmulationMode 値では、SharePoint 呼び出しが実際の SharePoint サイトに対してエミュレートまたは実行されているかどうかを指定します。The EmulationMode value specifies whether the SharePoint calls are emulated or executed against a real SharePoint site.

  • テスト クラスのテスト メソッドのほとんどまたはすべてがエミュレーションのコンテキストで実行される場合は、クラス レベルの TestInitialize 属性付きメソッドを使用して SharePointEmulationScope オブジェクトを作成し、クラス レベルのフィールドを使用してエミュレーション モードを設定できます。If all or most of your test methods in a test class execute in the emulation context, you can use a class-level TestInitialize attributed method to create the SharePointEmulationScope object and a class-level field to set the emulation mode. これは、エミュレーション モードの変更を自動化するときに役立ちます。This will help you to automate the changing of the emulation mode. その後、TestCleanup 属性付きメソッドを使用して、スコープ オブジェクトを破棄します。Then use a TestCleanup attributed method to dispose of the scope object.

    このトピックの内容In this topic

Example

次に示す最後の例には、上記の SharePoint エミュレーター手法が組み込まれています。Here's a final example that incorporates the SharePoint emulator techniques that are described above:

using System;   
//other namespace declarations  
...   
// code under test  
using MySPApps;  
using Microsoft.SharePoint;  
// unit testing and emulators  
using Microsoft.VisualStudio.TestTools.UnitTesting;  
using Microsoft.QualityTools.Testing.Emulators;  
using Microsoft.SharePoint.Emulators;  
// explicit Fakes shims  
using Microsoft.QualityTools.Testing.Fakes;  
using Microsoft.SharePoint.Fakes  

namspace MySPAppTests   
{  
    [TestClass]  
    public class BookAnAppointmentWebPartTests  
    {  

        // emulationScope is a class level field  
        private SharePointEmulationScope emulationScope;  

        // preprocessor directives determine the value of emulatorMode  
        #if USE_EMULATION  
            private const EmulationMode emulatorMode = EmulationMode.Enabled;  
        #else  
            private const EmulationMode emulatorMode = EmulationMode.Passthrough;  
        #endif  

        // InitializeTest sets the emulation scope at the beginning of each test method  
        [TestInitialize]  
        public void InitializeTest()  
        {  
            this.emulationScope = new SharePointEmulationScope(emulatorMode);  
        }  

        // CleanupTest disposes the emulation scope at the end of each test method  
        [TestCleanup]  
        public void Cleanup()  
        {  
            this.emulationScope.Dispose();  
        }  

        [TestMethod]  
        public void ScheduleAppointmentReturnsTrueWhenNewAppointmentIsCreated()  
        {  
            // remove the SharePointEmulationScope using statement from the method  
            using( var site = new SPSite("http://localhost"))  
            using (var webPart = new BookAnAppointmentWebPart())  
            {  
                // Arrange  
                string errorMsg = string.Empty;  
                DateTime date = DateTime.Now;  
                SPList list = AddListToSiteHelper(site);  

                // Act  
                bool success = webPart.ScheduleAppointment(site.RootWeb, list.Title,  
                    "Raisa Pokrovskaya", "425-555-0163", "raisa@outlook.com", "55", date,   
                    out errorMsg);  
                list.Delete()  

                // Assert  
                Assert.IsTrue(success);  
            }  
        }  

        [TestMethod]  
        public void GetAppointmentsForTodayReturnsOnlyTodaysAppointments()  
        {  

            // remove the SharePointEmulationScope using statement from the method  
            using( var site = new SPSite("http://localhost"))  
            using (var webPart = new BookAnAppointmentWebPart())  
            {  
                // Arrange  
                DateTime date = DateTime.Now;  
                SPList list = AddListToSiteHelper(site);  
                // insert 2 items into list  
                AddItemsToListHelper(list, new string[] {"Raisa Pokrovskaya", "425-555-0163",  
                    "raisa@outlook.com", "55", date.ToString("D") });  
                AddItemsToListHelper(list, new string[] {"Francis Totten", "313-555-0100",  
                    "francis@contoso.com", "42", date.AddDays(1).ToString("D") });  

                // use Fakes shims only if emulation is enabled  
                if (emulatorMode == EmulationMode.Enabled)  
                {  
                    var sList = new ShimSPList(list);  

                    sList.GetItemsSPQuery = (query) =>  
                    {  
                        var shim = new ShimSPListItemCollection();  
                        shim.Bind(new[] { list.Items[0] });  
                        return shim.Instance;  
                    }  
                }  

                // Act  
                string result = webPart.GetAppointmentsForToday(list.Title, site.RootWeb);  
                list.Delete();  

                // Assert  
                Assert.IsTrue(result.Contains(String.Format(  
                    "Name: Raisa Pokrovskaya, Phone: 425-555-0163, Email: raisa@outlook.com," +  
                    "Age: 55, Date: {0}", date.ToString("D"))));  
                Assert.IsFalse(result.Contains("Name: Francis Totten"));  
            }  
        }  

        ...// More tests  

    }  
}  

エミュレートされた SharePoint の型Emulated SharePoint types

Microsoft.SharePoint.SPFieldMicrosoft.SharePoint.SPField

Microsoft.SharePoint.SPFieldIndexMicrosoft.SharePoint.SPFieldIndex

Microsoft.SharePoint.SPFieldIndexCollectionMicrosoft.SharePoint.SPFieldIndexCollection

Microsoft.SharePoint.SPFieldLinkMicrosoft.SharePoint.SPFieldLink

Microsoft.SharePoint.SPFieldLinkCollectionMicrosoft.SharePoint.SPFieldLinkCollection

Microsoft.SharePoint.SPFieldUrlValueMicrosoft.SharePoint.SPFieldUrlValue

Microsoft.SharePoint.SPFileMicrosoft.SharePoint.SPFile

Microsoft.SharePoint.SPFileCollectionMicrosoft.SharePoint.SPFileCollection

Microsoft.SharePoint.SPFolderMicrosoft.SharePoint.SPFolder

Microsoft.SharePoint.SPFolderCollectionMicrosoft.SharePoint.SPFolderCollection

Microsoft.SharePoint.SPItemMicrosoft.SharePoint.SPItem

Microsoft.SharePoint.SPItemEventDataCollectionMicrosoft.SharePoint.SPItemEventDataCollection

Microsoft.SharePoint.SPItemEventPropertiesMicrosoft.SharePoint.SPItemEventProperties

Microsoft.SharePoint.SPListMicrosoft.SharePoint.SPList

Microsoft.SharePoint.SPListCollectionMicrosoft.SharePoint.SPListCollection

Microsoft.SharePoint.SPListEventPropertiesMicrosoft.SharePoint.SPListEventProperties

Microsoft.SharePoint.SPListItemMicrosoft.SharePoint.SPListItem

Microsoft.SharePoint.SPListItemCollectionMicrosoft.SharePoint.SPListItemCollection

Microsoft.SharePoint.SPQueryMicrosoft.SharePoint.SPQuery

Microsoft.SharePoint.SPRoleAssignmentMicrosoft.SharePoint.SPRoleAssignment

Microsoft.SharePoint.SPRoleAssignmentCollectionMicrosoft.SharePoint.SPRoleAssignmentCollection

Microsoft.SharePoint.SPSecurableObjectMicrosoft.SharePoint.SPSecurableObject

Microsoft.SharePoint.SPSecurityMicrosoft.SharePoint.SPSecurity

Microsoft.SharePoint.SPSiteMicrosoft.SharePoint.SPSite

Microsoft.SharePoint.SPUserMicrosoft.SharePoint.SPUser

Microsoft.SharePoint.SPUserCollectionMicrosoft.SharePoint.SPUserCollection

Microsoft.SharePoint.SPViewMicrosoft.SharePoint.SPView

Microsoft.SharePoint.SPViewCollectionMicrosoft.SharePoint.SPViewCollection

Microsoft.SharePoint.SPViewContextMicrosoft.SharePoint.SPViewContext

Microsoft.SharePoint.SPWebMicrosoft.SharePoint.SPWeb

Microsoft.SharePoint.SPWebCollectionMicrosoft.SharePoint.SPWebCollection

このトピックの内容In this topic

関連項目See Also

コードの単体テスト Unit Test Your Code
コード化された UI テストを使用した SharePoint 2010 アプリケーションのテスト Testing SharePoint 2010 Applications with Coded UI Tests
SharePoint 2010 および 2013 アプリケーションの Web パフォーマンス テストおよびロード テスト Web performance and load testing SharePoint 2010 and 2013 applications
SharePoint ソリューションの開発Developing SharePoint Solutions