我測試了以下控制器初始化:c。與私有構造#mock對象,通過靜態工廠方法
public class MyController : ApiController
{
private readonly IUserManager _users;
private int num = 0;
public MyController(IUserManager users)
{
_users = users;
}
public User GetByCredentials(string username, string pass)
{
var account = new Account(username, pass);
User u = _users.GetByCredentials(num, account);
return u;
}
我想嘲笑IUserManager.GetByCredentials方法,因爲我只想看到MyController.GetByCredentials方法按預期工作。問題是,用戶類不能直接實例化,所以我不能嘲笑一個User對象,因爲構造函數是私有的:
public class User
{
// private attributes here
protected User()
{
// do a lot of stuff here, call other objects to initialize attributes
}
private User(int num, string id, string userid, Account account)
: this()
{
// do other stuff here with the params
}
public static User CreateUser(int num, string id, string userid, Account account)
{
return new User(num, id, userid, account);
}
// and so on
}
我現在用的起訂量框架,但我願意接受不同的解決方案。在這種情況下,我寧願避免創建測試數據,因爲它依賴於數據庫的初始化,服務器等 - 然後它不再是單元測試。你有過這樣的問題嗎?你如何解決?謝謝。
感謝您的回答。我已經爲前一個添加了一條評論,我想唯一的辦法就是重構該代碼......該死的:S – Markon 2014-11-25 15:51:08
@Markon:基本上,當你有無法測試的代碼時,正確的路要走*是*重構它。我的意思是,你可以創建一個'IUser'接口,然後模擬*,但它聽起來像'User'中的混亂應該被解決。 – 2014-11-25 15:52:12
好的,謝謝 - 這是我想要的確認:) – Markon 2014-11-25 16:09:29