模拟内部具体方法

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 对象?

这需要一些重构。这就是为什么我发现单元测试有助于创建更好的代码。

就这样,一步一步来:

  1. 将构造函数中的 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()
            };
        }
    }
  1. 在你的测试中你需要做两件事,首先设置模拟响应
    Mock<IABCRepository> _iabcrepository = new Mock<IABCRepository>();
    _iabcrepository.Setup(foo => foo.ALayout()).Returns(MockValue);
    _iabcrepository.Setup(foo => foo.BLayout()).Returns(MockValue);
    // etc
  1. 在您的测试中(或 init,或您创建要测试的实例的任何地方)现在创建模拟对象并通过构造函数传递它
    var classToTest = new ClassToTest(_iabcrepository.Object);

现在,当您调用 DoSomething 函数时,模拟存储库将 return 模拟值。