模拟属性以测试验证方法

时间:2018-03-19 15:09:32

标签: c# unit-testing moq

我想测试一个验证已设置某些应用程序属性的方法。我正在尝试模拟获取设置的调用:

public interface IMyLogic{
    string GetSetting(string key);
    bool AreSettingsValid(); 
}

public class MyLogic: IMyLogic {
    public string GetSetting(string key){
        return (string) Properties.Settings.Default[key];
    }

    public bool AreSettingsValid(){
        return GetSetting("Setting1") != null && GetSetting("Setting2") != null;
    }
}

[TestClass]
public class MyLogicTest {
    [TestMethod]
    public void MyLogic_AreSettingsValidIsTrue_WhenValuesAreSet(){
        var mockMyLogic = Mock<IMyLogic>();
        mockMyLogic.Setup(m=>m.GetSetting(It.IsAny<string>())).Returns("something");
        Assert(true, mockMyLogic.Object.AreSettingsValid());
    }
}

这不起作用。如何让AreSettingsValid()触发对GetSetting的模拟调用?

1 个答案:

答案 0 :(得分:2)

您需要在不同的类中使用IMyLogic来模拟它并伪造输出。例如:

class MyLogic
{
    bool AreSettingsValid(IMySettings mySettings){
        return mySettings.GetSetting("Setting1") != null &&
               mySettings.GetSetting("Setting2") != null;
    }
}

class MySettings: IMySettings {
    string GetSetting(string key){
        return (string) Properties.Settings.Default[key];
    }

}

[TestClass]
class MyLogicTest 
{
    [TestMethod]
    void MyLogic_AreSettingsValidIsTrue_WhenValuesAreSet(){
        var mockMySettings = Mock<IMySettings>();

        mockMySettings.Setup(m=>
            m.GetSetting(It.IsAny<string())).Returns("something");


        var myLogic = new MyLogic();

        Assert(true, myLogic.AreSettingsValid(mySettings.Object));
    }
}

你想&#34;模拟&#34;在被测试的类中使用的接口,而不是模拟本身。

在上面的代码中,我添加了一个代表设置的新类。现在我可以模拟类实现的接口来模拟GetSettings()调用将执行的操作,即返回设置。我现在可以测试MyLogic类而不必依赖于Properties.Settings.Default [key]代码,因为它依赖于在进行单元测试时你并不真正想要依赖的外部存在的东西。

希望有帮助吗?