Bạn cần thêm và sử dụng Trình truy cập riêng tư. Nhấp chuột phải vào lớp điều khiển của bạn và chọn Create Private Accessors
từ trình đơn và thêm chúng vào dự án thử nghiệm của bạn. Khi đã ở trong dự án thử nghiệm của bạn, hãy tạo bộ điều khiển của bạn, sau đó tạo một trình truy cập cho nó. Phương thức này sẽ có sẵn trên accessor. Dưới đây là một thử nghiệm mẫu từ mã của riêng tôi:
/// <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: Nếu bạn không sử dụng MSTest cho unit tests của bạn, bạn có thể phải tạo ra các bộ truy xuất bằng tay. Về cơ bản, bạn tạo một lớp bao bọc cho thấy các phương thức riêng/được bảo vệ của lớp được kiểm tra thông qua các phương thức công khai tương đương, chuyển một thể hiện của lớp đang kiểm tra tới trình bao bọc, và sau đó sử dụng sự phản chiếu từ lớp trình bao bọc để gọi riêng/được bảo vệ phương pháp trên lớp đang được kiểm tra.
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 });
}
}
Đây có phải là MSTest cụ thể không? Tôi đang sử dụng nunit và xunit atm. –
Tôi chỉ hỏi vì tôi không thấy nút 'thêm người truy cập' và thực hiện tìm kiếm trên google mang đến cho tôi một số công cụ kiểm tra cụ thể của MS. –
Vâng, tôi nghĩ vậy. Tôi cho rằng nó đòi hỏi ít nhất VS Pro để nó ở đó. Bạn có thể tạo một bằng tay và sử dụng sự phản chiếu để gọi phương thức thích hợp trên đối tượng riêng bên dưới. – tvanfosson