データを ViewData に詰め込むコントローラーを単体テストしようとしています。私たちのすべてのビューには、同様のデータ (URL から派生した顧客情報) が必要です。そのため、元の開発者は、呼び出しをすべてのコントローラー メソッドに配置する代わりに、この ViewData スタッフィングを OnActionExecuting イベントに配置することを選択しました。
もちろん、単体テストからコントローラーのアクションを呼び出すと、OnActionExecuting は起動しません。(ありがとうMVCチーム!)
そこで、カスタム ビュー エンジンを作成し、ビューが要求されたときに顧客データを controllerContext に詰め込んでみました。これはブラウザーでは問題なく動作しますが、このテストを実行すると、viewEngine は無視されます。ViewEngines.Add(new funkyViewEngine) の量は効果がありません。
[TestMethod()]
public void LoginTest()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new FunkyViewEngine());
UserController target = new UserController();
target.SetStructureMap(); <--sets us to use the test repo
target.ControllerContext.HttpContext = MVCHelpers.FakeHttpContext("https://customersubdomain.ourdomain.com"); <--moq magic
var actual = target.Login();
Assert.IsTrue(actual.GetType().IsAssignableFrom(typeof(System.Web.Mvc.ViewResult)));
var vr = actual as ViewResult;
Assert.IsTrue(vr.ViewData.Community() != null); <--"Community" should be set by viewengine
Assert.IsTrue(vr.ViewData.Community().Subdomain == "customersubdomain.ourdomain");
Assert.IsTrue(vr.ViewData.Community().CanRegister);
}
ここに希望はありますか?1)ブラウザーとユニットフレームワークの両方でコントローラーの実行時に呼び出されるメソッドを作成するか、2)ユニットフレームワークを取得してビューエンジンを呼び出すにはどうすればよいですか。