创建一个从 Mock 继承属性的类。 C#

问题描述 投票:0回答:1

我想创建一个从 Mock 继承属性的类。这样,当我调用它时,我可以无缝地使用设置方法和其他功能

这是我的课

public class MockSettingsManager : Mock //  I know this doesn't work, but I want a similar solution to it
{
        private static SettingManagerCore singletonSettingManagerCore = null;
        private SettingManagerCore SettingManagerCore
        {
            get
            { 
             if (settingManagerCore== null)
             {
                 Mock<SettingManagerCore> settingManagerCoreMock = new Mock<SettingManagerCore>()
                 {
                   CallBase = true
                 };

                 settingManagerCore = settingManagerMock.Object;
              }

            return singletonSettingManagerCore;
            }
        }

      public virtual T GetSetting<T>(string name)
      {
         return SettingManagerCore.GetSetting<T>(name);
      }
}

现在我想这样称呼它

[TestClass]
public class MyTests
{
    private MockSettingsManager settingsManagerMock = null!;

    [TestInitialize]
    public void Initialize()
    {
        settingsManagerMock = new MockSettingsManager() { CallBase = true };
        // This one should go to the callbase
        var test = settingsManagerMock.Object.GetSetting<string>("Test");

        // This one should retrive Test1
        settingsManagerMock.Setup(x => x.GetSetting<string>("Test")).Returns("Test1")
        test = settingsManagerMock.Object.GetSetting<string>("Test");
    }
}

有人有什么想法吗?或者有可能吗?

.net asp.net-mvc mocking moq
1个回答
0
投票

您可以定义一个封装对象创建的函数,即

Creation Method
,而不是继承自Mock

internal Mock<SettingManagerCore> CreateSettingManagerTestDouble()
{
    return new Mock<SettingManagerCore>() { CallBase = true };
}

这个甚至已经到了值得写的门槛,因为那里几乎没有发生什么,但它确实给了你一个可以定义额外行为的点。

然后使用测试中的 if :

settingsManagerMock = CreateSettingManagerTestDouble();
// This one should go to the callbase
var test = settingsManagerMock.Object.GetSetting<string>("Test");

// This one should retrive Test1
settingsManagerMock.Setup(x => x.GetSetting<string>("Test")).Returns("Test1")
test = settingsManagerMock.Object.GetSetting<string>("Test");
© www.soinside.com 2019 - 2024. All rights reserved.