私はViewDataにデータを入れるコントローラをユニットテストしようとしています。我々の見解はすべて、同様のデータ(URLから派生した顧客情報)を必要とします。そのため、元の開発者は、この呼び出しをすべての単一のコントローラメソッドに入れるのではなく、このViewDataをOnActionExecutingイベントに入れることを選択しました。ユニットテストでASP.NET MVC2カスタムビューエンジンが無視される
もちろん、ユニットテストからコントローラのアクションを呼び出すと、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)ビューフレームを呼び出すユニットフレームワークを取得するかのどちらかです。
ええ、ViewEngineのことは、この動作によってすべてが簡単なコントローラを完全にテストできないようにするというハックでした。私はOnActionExecutingとOnActionExecutedを呼び出すPublicラッパーを置いて手動で呼び出すことができますが、それはRoleFilter、SessionFilter、RequireHttpsなどの属性に役立ちません。 –
アプリケーションと信頼関係を構成するコンポーネントを個別にテストする必要があります:)フレームワークはすべてが一緒に働くようにします。たとえば、フィルター属性の場合、リフレクションを使用して、属性がメソッドに宣言されていることを確認することができます。 Mvcはテスト可能に設計されており、難しいのはフレームワーク自体をテストしようとするときだけです。このような問題にぶつかると、別のアプローチを取らなければならないかもしれないという良い指標です。 – marcind
MyController.Actionがhttpをhttpsに正しくリダイレクトしてユーザーをログインさせることを確認するために単体テストを使用できないということはまだ完全に壊れています。チームを蹴ってTDDに向かって叫んでいる人は、MVCチームがテストを邪魔しています。 –