C# 以XML作为数据源的单元测试存储库
我是一个单元测试noob的人,正在努力寻找一种测试我的存储库的好方法。我创建了一个CustomConfigurationManager,用于加载我的C# 以XML作为数据源的单元测试存储库,c#,asp.net-mvc,unit-testing,tdd,C#,Asp.net Mvc,Unit Testing,Tdd,我是一个单元测试noob的人,正在努力寻找一种测试我的存储库的好方法。我创建了一个CustomConfigurationManager,用于加载我的Custom.Config值。但却不知道如何测试它们 我的问题是 如何测试GetUserById()中的代码 如何测试我的CustomConfigurationManager() 这是我正在尝试测试的存储库: public class UserRepository : IUserRepository { public User GetUser
Custom.Config
值。但却不知道如何测试它们
我的问题是
GetUserById()中的代码
CustomConfigurationManager()
public class UserRepository : IUserRepository
{
public User GetUserById(string id)
{
return CustomConfigurationManager.CustomConfig.Users.FirstOrDefault(u => u.UserId == id);
}
}
public class CustomConfigurationManager
{
public static Configs CustomConfig
{
get
{
return CustomConfigLoader.LoadConfig<Configs>();
}
}
}
internal sealed class ConfigLoader
{
public static T LoadConfig<T>() where T : class
{
...
return LoadFromXML<T>();
}
}
公共类用户存储库:IUserRepository
{
公共用户GetUserById(字符串id)
{
返回CustomConfigurationManager.CustomConfig.Users.FirstOrDefault(u=>u.UserId==id);
}
}
公共类CustomConfigurationManager
{
公共静态配置CustomConfig
{
得到
{
返回CustomConfigLoader.LoadConfig();
}
}
}
内部密封类ConfigLoader
{
公共静态T LoadConfig(),其中T:class
{
...
返回LoadFromXML();
}
}
还有XML
<users>
<user id="Foo" name="Bar" ... />
...
</users>
...
我粘贴的代码已修改,不是真正的代码。这只是一个例子 我相信很多人会指出,从精确的意义上讲,如果您正在读取一个文件,那么它不是一个单元测试。真的,你应该以一种更宽松的方式来测试类似的东西,或者找到一种伪造它的方法 一个应该对你有很大帮助的提示:
public class UserRepository : IUserRepository
{
public Configs CustomConfig {get;set;}
public User GetUserById(string id)
{
return CustomConfig.Users.FirstOrDefault(u => u.UserId == id);
}
}
其思想是,通过注入它(可能仅在构造函数中),您可以在不读取文件的情况下测试它。这称为DI(依赖项注入),通常最好使用接口来完成
CustomConfigurationManager很难测试,因为它调用属性中的另一个静态方法;你可以不用它。这是额外的复杂性,它隐藏了细节,但也隐藏了依赖关系,这是你永远不想做的
不能在没有内联VISILBTO的情况下测试配置加载程序,但我也认为这是个错误的做法。这个班需要密封吗
尽量将设计的重点放在使方法工作上,而不在可能的情况下假设具体的实现。如果你发现自己传递的东西太多,你可能需要一个新的类。如果你发现自己一次做了太多的事情,你可能需要更多的方法。我相信很多人会指出,从精确的意义上讲,如果你在读一个文件,那就不是单元测试。真的,你应该以一种更宽松的方式来测试类似的东西,或者找到一种伪造它的方法 一个应该对你有很大帮助的提示:
public class UserRepository : IUserRepository
{
public Configs CustomConfig {get;set;}
public User GetUserById(string id)
{
return CustomConfig.Users.FirstOrDefault(u => u.UserId == id);
}
}
其思想是,通过注入它(可能仅在构造函数中),您可以在不读取文件的情况下测试它。这称为DI(依赖项注入),通常最好使用接口来完成
CustomConfigurationManager很难测试,因为它调用属性中的另一个静态方法;你可以不用它。这是额外的复杂性,它隐藏了细节,但也隐藏了依赖关系,这是你永远不想做的
不能在没有内联VISILBTO的情况下测试配置加载程序,但我也认为这是个错误的做法。这个班需要密封吗
尽量将设计的重点放在使方法工作上,而不在可能的情况下假设具体的实现。如果你发现自己传递的东西太多,你可能需要一个新的类。如果你发现自己一次做了太多的事情,你可能需要更多的方法。我相信很多人会指出,从精确的意义上讲,如果你在读一个文件,那就不是单元测试。真的,你应该以一种更宽松的方式来测试类似的东西,或者找到一种伪造它的方法 一个应该对你有很大帮助的提示:
public class UserRepository : IUserRepository
{
public Configs CustomConfig {get;set;}
public User GetUserById(string id)
{
return CustomConfig.Users.FirstOrDefault(u => u.UserId == id);
}
}
其思想是,通过注入它(可能仅在构造函数中),您可以在不读取文件的情况下测试它。这称为DI(依赖项注入),通常最好使用接口来完成
CustomConfigurationManager很难测试,因为它调用属性中的另一个静态方法;你可以不用它。这是额外的复杂性,它隐藏了细节,但也隐藏了依赖关系,这是你永远不想做的
不能在没有内联VISILBTO的情况下测试配置加载程序,但我也认为这是个错误的做法。这个班需要密封吗
尽量将设计的重点放在使方法工作上,而不在可能的情况下假设具体的实现。如果你发现自己传递的东西太多,你可能需要一个新的类。如果你发现自己一次做了太多的事情,你可能需要更多的方法。我相信很多人会指出,从精确的意义上讲,如果你在读一个文件,那就不是单元测试。真的,你应该以一种更宽松的方式来测试类似的东西,或者找到一种伪造它的方法 一个应该对你有很大帮助的提示:
public class UserRepository : IUserRepository
{
public Configs CustomConfig {get;set;}
public User GetUserById(string id)
{
return CustomConfig.Users.FirstOrDefault(u => u.UserId == id);
}
}
其思想是,通过注入它(可能仅在构造函数中),您可以在不读取文件的情况下测试它。这称为DI(依赖项注入),通常最好使用接口来完成
CustomConfigurationManager很难测试,因为它调用属性中的另一个静态方法;你可以不用它。这是额外的复杂性,它隐藏了细节,但也隐藏了依赖关系,这是你永远不想做的
不能在没有内联VISILBTO的情况下测试配置加载程序,但我也认为这是个错误的做法。这个班需要密封吗
尽量将设计的重点放在使方法工作上,而不在可能的情况下假设具体的实现。如果你发现自己传递的东西太多,你可能需要一个新的类。如果您发现自己一次做的事情太多,您可能需要更多的方法。您是否考虑过依靠集成测试来证明您的存储库工作正常?你可以创建一个模拟数据库来测试你的存储库方法,但是你仍然需要用一个真实的数据库来测试它们