gpt4 book ai didi

c# - N层架构中的单元测试

转载 作者:行者123 更新时间:2023-11-28 21:11:24 25 4
gpt4 key购买 nike

我想为别人编写的程序编写测试。但是我在编写测试时遇到了一些问题。我不明白如何伪造某些物体。我搜索并找到了Unit Test for n tier architecture但这对我没有帮助。例如,我想为下面的代码编写一个测试(我知道这是一个伪代码,只是为了澄清)

        public List<CustomerObject> FetchCustomersByName(CustomerObject obj)
{
DAL customerDal = new DAL();
//Maybe other operations
List<CustomerObject> list = customerDal.FetchByName(obj.Name);
//Maybe other operations over list
return list;
}

我只想测试 FetchCustomersByName 但与 DAL 有联系。我想创建 stub 类,但在这种情况下,我必须更改原始代码。它是由其他人编码的。如何为此方法编写测试?

提前致谢。

最佳答案

不要对数据访问层进行单元测试。为它编写集成测试。

模拟 DAL 中的依赖关系不仅值得麻烦,因为它不能保证任何事情。

如果您考虑一下,DAL 依赖于 SQL 方言和数据库模式。因此,您的单元测试可能工作得很好。但是当你运行真正的解决方案时,它仍然会失败。原因可能是您的 SQL 查询不正确,或者其中一个类属性类型与表列类型不匹配。

单元测试通常是为业务逻辑编写的。他们捕获的一件事是不会生成异常的错误,例如不正确的条件或计算错误。

更新

好的。所以你的例子实际上包含业务逻辑。方法名骗了我。

您必须更改创建 DAL 类的方式。但是您不必像 Jack Hughes 建议的那样使用构造函数注入(inject)。相反,您可以使用工厂模式:

    public List<CustomerObject> FetchCustomersByName(CustomerObject obj)
{
var customerDal = DalFactory.Create<CustomerDal>();

//Maybe other operations
List<CustomerObject> list = customerDal.FetchByName(obj.Name);
//Maybe other operations over list
return list;
}

这更容易一些,因为现在您可以使用“全部替换”来更改所有 var customerDal = new CustomerDal()var customerDal = DalFactory.Create<CustomerDal>();

在那个工厂类中你可以调用不同的实现

public class DalFactory
{
public static IDalFactory Factory { get set; }

static DalFactory()
{
Factory = new DefaultDalFactory();
}


public static T Create<T>() where T : class
{
return Factory.Create<T>();
}
}

public interface IDalFactory
{
T Create<T>() where T : class
}

public class DefaultDalFactory : IDalFactory
{
public T Create<T>() where T : class
{
return new T();
}
}

代码并不漂亮,但它以最少的重构解决了您的问题。我建议您从那个开始,然后尝试更改您的编码标准,以便允许构造函数注入(inject)。

要让它在您的测试中正常工作,您可以使用以下实现。它使用 [ThreadStatic] 允许同时运行多个测试。

public class TestDalFactory : IDalFactory
{
[ThreadStatic]
private static Dictionary<Type, object> _instances;

public static Dictionary<Type, object> DalInstances
{
get
{
if (_instances == null)
_instances = new Dictionary<Type, Object>();
return _instances;
}
}

public static TestDalFactory Instance = new TestDalFactory();

public T Create<T>() where T : class
{
return (T)_instances[typeof(T)];
}
}

接下来在您的测试中,您可以通过执行以下操作将 DAL 工厂配置为返回模拟:

[TestClass]
public class MyBusinessTests
{
[TestInitialize]
public void Init()
{
DalFactory.Instance = TestDalFactory.Instance;
}

[TestMethod]
public void do_some_testing_in_the_business()
{
TestDalFactory.Instance.DalInstances[typeof(CustomerDal)] = new MyNewMock();

//do the testing here
}
}

关于c# - N层架构中的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26115482/

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