Bạn gặp sự cố với mã của mình. Hành động của bạn phụ thuộc vào phương pháp tĩnh: Membership.CreateUser
. Và như bạn biết phương pháp tĩnh là PITAs để kiểm tra đơn vị.
Vì vậy, bạn có thể làm suy yếu các khớp nối bằng cách giới thiệu một mức độ trừu tượng:
public interface IMyService
{
MembershipCreateStatus CreateUser(string username, string password, string email);
}
và sau đó có một số thực hiện mà sẽ sử dụng các nhà cung cấp thành viên hiện tại:
public class MyService: IMyService
{
public MembershipCreateStatus CreateUser(string username, string password, string email)
{
MembershipCreateStatus status;
Membership.CreateUser(username, password, email, null, null, true, null, out status);
return status;
}
}
và cuối cùng là bộ điều khiển:
public class AccountController : Controller
{
private readonly IMyService _service;
public AccountController(IMyService service)
{
_service = service;
}
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
var status = _service.CreateUser(model.UserName, model.Password, model.Email);
if (status == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
}
OK, bây giờ chúng tôi đã làm suy yếu khớp nối chúng tôi có thể e một khuôn khổ mocking để giả lập dịch vụ trong bài kiểm tra đơn vị và làm cho nó tầm thường.
Ví dụ sử dụng Rhino Mocks bạn có thể tạo các xét nghiệm sau đây để trang trải các trường hợp 2 thất bại:
[TestMethod]
public void Register_Action_Should_Redisplay_View_If_Model_Is_Invalid()
{
// arrange
var sut = new AccountController(null);
var model = new RegisterModel();
sut.ModelState.AddModelError("", "invalid email");
// act
var actual = sut.Register(model);
// assert
Assert.IsInstanceOfType(actual, typeof(ViewResult));
var viewResult = actual as ViewResult;
Assert.AreEqual(model, viewResult.Model);
}
[TestMethod]
public void Register_Action_Should_Redisplay_View_And_Add_Model_Error_If_Creation_Fails()
{
// arrange
var service = MockRepository.GenerateStub<IMyService>();
service
.Stub(x => x.CreateUser(null, null, null))
.IgnoreArguments()
.Return(MembershipCreateStatus.InvalidEmail);
var sut = new AccountController(service);
var model = new RegisterModel();
// act
var actual = sut.Register(model);
// assert
Assert.IsInstanceOfType(actual, typeof(ViewResult));
var viewResult = actual as ViewResult;
Assert.AreEqual(model, viewResult.Model);
Assert.IsFalse(sut.ModelState.IsValid);
}
Các thử nghiệm cuối cùng là trường hợp thành công. Chúng tôi vẫn gặp vấn đề với nó. Vấn đề là dòng sau:
FormsAuthentication.SetAuthCookie(model.UserName, false);
Đây là gì? Đó là một cuộc gọi phương thức tĩnh. Vì vậy, chúng tôi tiến hành theo cách tương tự như chúng tôi đã làm với các nhà cung cấp thành viên để làm suy yếu các khớp nối của bộ điều khiển của chúng tôi và hệ thống xác thực mẫu.
+1 cho lượt đi bộ tuyệt vời và dễ theo dõi. – ljubomir