kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

SharePointエミュレーターを使用して単体テストを行う

これはALM Advent Calendar 2012の14日目の記事です。本当はIntelliTraceまで行きたかったんですが、時間の都合で次にまわります。
Visual Studio 2012 Update1の新機能として、SharePoint単体テストがサポートされました。SharePointのテストとかクラッシュしたときのデバッグはリモート(もしくはローカル)のIISのアタッチにして、という感じで結構大変だったのではないでしょうか。IntelliTrace機能を使えばVisual Studioを使わずにトラブル調査ができそうです。また、エミュレーターでパーツの単体テストも楽になりそうです。
ただし、SharePointエミュレーターがFakes Frameworkに依存しているため、残念ながらUltimate Edition限定です。これはもうちょっと広いエディションで使えるようになってほしいですね。

必要な環境(SharePoint 2010の場合)

必要な環境(SharePoint 2013の場合)

SharePoint 2013もリリースされていますが、開発環境はまだPreview2です。Web Platform InstallerからMicrosoft Office Developer Tools for Visual Studio 2012をインストールしてください。ついでにLightSwitch HTML Client Preview2もインストールされます。リモートのSharePointに発行する場合でも、ローカルにSharePointの開発環境が必要となります。そして、SharePointの開発環境はWindows Serverにしかインストールすることができません。厳しいです。
SharePoint Foundationを使用した開発であればメモリ4GBの仮想マシンでもなんとか行けますが、フル機能のSharePointの場合、最低16GBできれば24GBのメモリが必要だそうですので、注意してください。いまどきのマシンならいけるものもある…かな。

単体テストプロジェクトを作る

まず、普通に単体テストプロジェクトを作ります。

SharePointエミュレーターはNuGetで提供されているので、NuGetコンソールなどから、以下のようにInstall-PackageコマンドレットでMicrosoft.SharePoint.Emulatorsを追加してください。

ライセンスの警告が出ます。

NuGetでエミュレーターが追加されると、プロジェクトにこのようにFakesフォルダとEmulatorsがつく名前空間アセンブリが追加されます。

単体テストプロジェクトではこれらの名前空間をusingで追加します。Webパーツの単体テストはこんな感じでしょうか。Webパーツの名前空間も忘れずに追加してください。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Emulators;
using Microsoft.QualityTools.Testing.Emulators;
namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            using (new SharePointEmulationScope(EmulationMode.Enabled))  {
                //エミュレーターで動作中
            }
        }
    }
}

SharePointEmulationScope()クラスでエミュレーターかどうか判定できるようですので、この中に処理を書いていけばWebパーツのテストができますね!