gpt4 book ai didi

具有私有(private)构造函数的 c# 模拟对象,通过静态工厂方法初始化

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:15 25 4
gpt4 key购买 nike

我正在测试以下 Controller :

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 类不能直接实例化,所以我不能模拟 User 对象,因为构造函数是私有(private)的:

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

}

我正在使用 Moq 框架,但我对不同的解决方案持开放态度。在这种情况下,我宁愿避免创建测试数据,因为它依赖于数据库、初始化、服务器等——然后它就不再是单元测试了。你遇到过这样的问题吗?你如何解决?谢谢。

最佳答案

您不需要模拟 User - 您可以使用真正的 User 类。您只需要模拟(或伪造)IUserManager。您的模拟/伪造 IUserManager 可以使用 User.CreateUser 来创建要返回给您的 Controller 的 User 对象。

除非 User 类本身“知道”数据库,否则应该没问题。抵制模拟一切的诱惑 - 您只需要摆脱使编写测试变得困难的依赖项。

现在您已经编写了您的 User 私有(private)构造函数“做了很多事情”——如果这超出了范围,您应该重新设计 User 以使其更简单。 .. 你的用户经理可能应该负责那里正在进行的一些工作。

虽然将世界完全拆分为服务(如用户管理器)和哑数据对象(如用户)过于简单化,但如果设计合理自然地将自身拆分为那种尊重。

关于具有私有(private)构造函数的 c# 模拟对象,通过静态工厂方法初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com