模拟内部具体方法
Mock internal concrete methods
我应该如何模拟下面的行?
ABCRepository abcObj = new ABCRepository();
var model = new NamesList
{
ALayoutNames = abcObj.ALayout(),
BLayoutNames = abcObj.BLayout(),
CLayoutNames = abcObj.CLayout(),
DLayoutNames = abcObj.DLayout(),
ELayoutNames = abcObj.ELayout()
};
我模拟了第一行的界面如下
Mock<IABCRepository> _iabcrepository = new Mock<IABCRepository>();
但是如何处理 NamesList 对象?
这需要一些重构。这就是为什么我发现单元测试有助于创建更好的代码。
就这样,一步一步来:
- 将构造函数中的 ABCRepository 作为 class 的参数移动,即
public class ClassToTest {
private IABCRepository abcObj;
public ClassToTest(IABCRepository repo) {
this.abcObj = repo;
}
public DoingSomething() {
var model = new NamesList
{
ALayoutNames = this.abcObj.ALayout(),
BLayoutNames = this.abcObj.BLayout(),
CLayoutNames = this.abcObj.CLayout(),
DLayoutNames = this.abcObj.DLayout(),
ELayoutNames = this.abcObj.ELayout()
};
}
}
- 在你的测试中你需要做两件事,首先设置模拟响应
Mock<IABCRepository> _iabcrepository = new Mock<IABCRepository>();
_iabcrepository.Setup(foo => foo.ALayout()).Returns(MockValue);
_iabcrepository.Setup(foo => foo.BLayout()).Returns(MockValue);
// etc
- 在您的测试中(或 init,或您创建要测试的实例的任何地方)现在创建模拟对象并通过构造函数传递它
var classToTest = new ClassToTest(_iabcrepository.Object);
现在,当您调用 DoSomething 函数时,模拟存储库将 return 模拟值。
我应该如何模拟下面的行?
ABCRepository abcObj = new ABCRepository();
var model = new NamesList
{
ALayoutNames = abcObj.ALayout(),
BLayoutNames = abcObj.BLayout(),
CLayoutNames = abcObj.CLayout(),
DLayoutNames = abcObj.DLayout(),
ELayoutNames = abcObj.ELayout()
};
我模拟了第一行的界面如下
Mock<IABCRepository> _iabcrepository = new Mock<IABCRepository>();
但是如何处理 NamesList 对象?
这需要一些重构。这就是为什么我发现单元测试有助于创建更好的代码。
就这样,一步一步来:
- 将构造函数中的 ABCRepository 作为 class 的参数移动,即
public class ClassToTest {
private IABCRepository abcObj;
public ClassToTest(IABCRepository repo) {
this.abcObj = repo;
}
public DoingSomething() {
var model = new NamesList
{
ALayoutNames = this.abcObj.ALayout(),
BLayoutNames = this.abcObj.BLayout(),
CLayoutNames = this.abcObj.CLayout(),
DLayoutNames = this.abcObj.DLayout(),
ELayoutNames = this.abcObj.ELayout()
};
}
}
- 在你的测试中你需要做两件事,首先设置模拟响应
Mock<IABCRepository> _iabcrepository = new Mock<IABCRepository>();
_iabcrepository.Setup(foo => foo.ALayout()).Returns(MockValue);
_iabcrepository.Setup(foo => foo.BLayout()).Returns(MockValue);
// etc
- 在您的测试中(或 init,或您创建要测试的实例的任何地方)现在创建模拟对象并通过构造函数传递它
var classToTest = new ClassToTest(_iabcrepository.Object);
现在,当您调用 DoSomething 函数时,模拟存储库将 return 模拟值。