用于测试验证方法的模拟属性



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

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的模拟调用?

您需要在不同的类中使用 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));
    }
}

您希望"模拟"被测类中使用的接口,而不是模拟本身。

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

希望有帮助吗?

最新更新