プライベートアクセサを追加して使用する必要があります。コントローラクラスを右クリックし、メニューからCreate Private Accessors
を選択してテストプロジェクトに追加します。テストプロジェクトに入ったら、コントローラを作成し、コントローラのアクセサを作成します。このメソッドはアクセサ上で利用できるはずです。
/// <summary>
///A test for OnActionExecuting
///</summary>
[TestMethod()]
[ExpectedException(typeof(InvalidOperationException))]
public void OnActionExecutingWindowsIdentityTest()
{
var identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
var httpContext = MockRepository.GenerateStub<HttpContextBase>();
httpContext.User = principal;
var actionDescriptor = MockRepository.GenerateStub<ActionDescriptor>();
RouteData routeData = new RouteData();
BaseController controller = new BaseController();
BaseController_Accessor accessor = new BaseController_Accessor(new PrivateObject(controller));
ControllerContext controllerContext = MockRepository.GenerateStub<ControllerContext>(httpContext, routeData, controller);
ActionExecutingContext filterContext = new ActionExecutingContext(controllerContext, actionDescriptor, new Dictionary<string, object>());
accessor.OnActionExecuting(filterContext);
}
はEDIT:あなたのユニットテストのためのMSTestをを使用していない場合、あなたは手でアクセサを生成する必要があります。ここに私自身のコードからサンプルテストです。基本的には、テスト対象のクラスのprivate/protectedメソッドを同等のパブリックメソッドで公開し、テスト対象のクラスのインスタンスをラッパーに渡し、ラッパークラスからのリフレクションを使用してprivate/protectedメソッドを呼び出すラッパークラスを作成しますメソッドをテスト対象クラスに追加します。
public class MyClass
{
protected void DoSomething(int num)
{
}
}
public class MyClass_accessor
{
private MyClass privateObj;
public MyClass_accessor(MyClass obj)
{
this.privateObj = obj;
}
public void DoSomething(int num)
{
MethodInfo info = privateObj.GetType()
.GetMethod("DoSomething",
BindingFlags.NonPublic
| BindingFlags.Instance);
info.Invoke(obj,new object[] { num });
}
}
このMSTestは具体的ですか?私はnunitとxunit atmを使用しています。 –
「アクセサーを追加」コンテキストボタンが表示されず、google検索を実行するとmsテストの特定のものが表示されるので、私は尋ねるだけです。 –
はい、そうです。私はそれがそこにいるために少なくともVS Proが必要だと思います。あなたは手動で作成することもできますし、リフレクションを使って基底のプライベートオブジェクトに対して適切なメソッドを呼び出すこともできます。 – tvanfosson