gpt4 book ai didi

c# - 我可以测试一个使用单例的类吗?还是有其他解决方案

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:42 26 4
gpt4 key购买 nike

我遇到了一个问题。我创建了一个使用 IoC 的解决方案。但是,我有一个致命的缺陷——我使用的主要 DTO(数据传输对象——因此,一个穿过层的类)包含,例如,一个有名字、姓氏、出生日期、状态 ID 的人……和一个列表有效状态。

创建 Person 类时会填充状态,并且数据来自引用数据存储库...此存储库是单例并从缓存中获取数据(它最初从数据库中获取数据)。

所以,

Name string {get; set;}
Surname string {get; set;}
StatusId int {get; set;}
Statuses List<ReferenceItem> {get; set;} = ReferenceData.GetData(DataType.ClientStatus);

在我的单元测试中,我最终依赖于 ReferenceData 类,它是一个单例。有没有办法以某种方式注入(inject)模拟 ReferenceData 类?还是我的设计有缺陷,我需要重新设计我的 Person 类?

最佳答案

你必须重新设计你的类并使用构造函数注入(inject)。按照这个例子(引用你的):

class Person {
public string Name { get; set; }
public string Surname { get; set; }
public int StatusId { get; set; }
public List<ReferenceItem> Statuses { get; set; }

public Person(IReferenceDataProvider provider) {
Statuses = provider.GetData(DataType.ClientStatus);
}
}

或者您可以直接使用 IoC 容器来解决构造函数内部的依赖关系:

... 
public Person() {
var provider = IoC.Resolve<IReferenceDataProvider>();
Statuses = provider.GetData(DataType.ClientStatus);
}
...

无论如何,你必须抽象你的类引用并使用接口(interface)来代替。希望这能有所帮助。

关于c# - 我可以测试一个使用单例的类吗?还是有其他解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45935473/

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