2 回答
TA贡献1794条经验 获得超8个赞
据我所知,您MethodA
不需要A
实例即可运行,因此您可以将其更改为static
并在没有A
实例的情况下对其进行测试。但请注意,从 OOP 的角度来看,此方法在A
类中没有位置(单一职责原则),因此您需要进行一些重构。
TA贡献2016条经验 获得超9个赞
虽然很清楚MethodAcan be static,但它不使用class我建议采用不同方法的任何字段,因为问题用moq和inversion-of-control标签标记。进行一些重新设计,您可以将其存档...例如,您可以通过IRepository界面公开列表,然后您可以利用 IoC 原则在单元测试中启用模拟。像这样的东西:
public interface IRepository
{
void Init();
IList<int> Get();
}
public Class A
{
IRepository _aRepository;
IRepository _bRepository;
IRepository _cRepository;
public A(IRepository aRepository, IRepository bRepository, IRepository bRepository)
{
_aRepository = aRepository;
_bRepository = bRepository;
_cRepository = cRepository;
MethodB();
}
public IList<int> GetA()
{
return _aRepository.Get();
}
public IList<int> GetB()
{
return _bRepository.Get();
}
public IList<int> GetC()
{
return _cRepository.Get();
}
private void MethodB()
{
_aRepository.Init();
_bRepository.Init();
_cRepository.Init();
}
public bool MethodA(customerCollection foo){...whatever...}
}
然后在单元测试中,您可以模拟您的存储库并利用 Moq 库
Mock<IRepository> aRepositoryMock = new Mock<IRepository>();
Mock<IRepository> bRepositoryMock = new Mock<IRepository>();
Mock<IRepository> cRepositoryMock = new Mock<IRepository>();
aRepositoryMock.Setup(m => m.Init)...setup Callback for example
aRepositoryMock.Setup(m => m.Get()).Returns(...some list...)
...aslo you can setup b and c repositories...
var sut = new A(aRepositoryMock.Object, bRepositoryMock.Object, cRepositoryMock.Object);
- 2 回答
- 0 关注
- 192 浏览
添加回答
举报