2013-12-21 143 views
0

我正在研究asp.net MVC 4應用程序並創建單元測試。我有一個帳戶控制器和寄存器,它有兩件事情的方法:FormsAuthentication.SetAuthCookie和Request.url單元測試失敗

if (this.Request.Url.ToString().Contains("127.0.0")) 
{ 
    user.AddPermission(UserEntity.PermissionType.BETA_ACCESS); 
} 

FormsAuthentication.SetAuthCookie(model.UserName, false); 

在這兩行測試失敗。我瞪大眼睛,發現我們不能用FormsAuthentication.SetAuthCookie爲FormsAuthentication是一個靜態類,所以我嘗試以下解決方法:

public interface IAuthenticationProvider 
{ 
    void SetAuthCookie(string username, bool remember); 
} 

public class FormsAuthWrapper : IAuthenticationProvider 
{ 
    public void SetAuthCookie(string userName, bool remember) 
    { 
     FormsAuthentication.SetAuthCookie(userName, remember); 
    } 
} 

,並在控制器動作我用:

_authenticationProvider.SetAuthCookie(model.UserName, false); 

在我使用的測試方法:

var wrapper = new FormsAuthWrapper(); 
AccountController controller = new AccountController(s, config, wrapper); 

但是當我調用控制器的操作方法,它仍然給上

對象引用空誤差
_authenticationProvider.SetAuthCookie(model.UserName, false); 

我的另一個問題是request.url有關,我想這在我的測試方法:

controller.ControllerContext = CreateStubControllerContext(controller); 

var requestStub = Mock.Get(controller.Request); 
requestStub.Setup(r => r.UrlReferrer).Returns(new Uri("http://127.0.0.1")); 

var RegisterModel = new RegisterModel { UserName = "[email protected]", Password = "testpass", ConfirmPassword = "testpass" };  
controller.Register(RegisterModel); 

,但它在這條線的控制器動作拋出錯誤:

if (this.Request.Url.ToString().Contains("127.0.0")) 
{ 
    user.AddPermission(UserEntity.PermissionType.BETA_ACCESS); 
} 

回答

0

你是問兩個不同的問題:

  1. 你應該使用月ckIAuthenticationProvider對你的測試,而不是具體的FormsAuthWrapper。如果沒有完整的Web上下文(後者在單元測試中永遠不會得到),後者將無法工作。

  2. 不太確定這一個,但我猜你只是嘲諷了錯誤的性質:它應該是Url而不是UrlReferrer(他們通常計算出相同的價值,但他們引用相同的字符串對象)。