Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟属性以测试验证方法_C#_Unit Testing_Moq - Fatal编程技术网

C# 模拟属性以测试验证方法

C# 模拟属性以测试验证方法,c#,unit-testing,moq,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.Set

我想测试一个方法,该方法验证是否设置了一些应用程序属性。我试图模拟获取设置的调用:

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());
    }
}
公共接口IMyLogic{
字符串设置(字符串键);
bool AreSettingsValid();
}
公共类MyLogic:IMyLogic{
公共字符串设置(字符串键){
返回(字符串)属性。设置。默认值[键];
}
公共布尔值AreSettingsValid(){
返回GetSetting(“Setting1”)!=null和&GetSetting(“Setting2”)!=null;
}
}
[测试类]
公共类MyLogicTest{
[测试方法]
public void MyLogic_是设置ValidDistributue_时的值集(){
var mockMyLogic=Mock();
mockMyLogic.Setup(m=>m.GetSetting(It.IsAny())。返回(“某物”);
断言(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));
    }
}
class MyLogic
{
bool AreSettingsValid(IMySettings mySettings){
返回mySettings.GetSetting(“Setting1”)!=null&&
mySettings.GetSetting(“Setting2”)!=null;
}
}
类MySettings:IMySettings{
字符串设置(字符串键){
返回(字符串)属性。设置。默认值[键];
}
}
[测试类]
类MyLogicTest
{
[测试方法]
void MyLogic_是设置ValidDistributue_时的值设置(){
var mockMySettings=Mock();
mockMySettings.Setup(m=>

m、 GetSetting(It.IsAny您需要在不同的类中使用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));
    }
}
class MyLogic
{
bool AreSettingsValid(IMySettings mySettings){
返回mySettings.GetSetting(“Setting1”)!=null&&
mySettings.GetSetting(“Setting2”)!=null;
}
}
类MySettings:IMySettings{
字符串设置(字符串键){
返回(字符串)属性。设置。默认值[键];
}
}
[测试类]
类MyLogicTest
{
[测试方法]
void MyLogic_是设置ValidDistributue_时的值设置(){
var mockMySettings=Mock();
mockMySettings.Setup(m=>

m、 GetSetting(It.isany此示例不完整。请提供一个示例,说明您不应该使用模拟作为您的测试代码。似乎您真正想要测试的是
MyLogic
,但模拟需要某种类型包装的
属性
。可以将
GetSettings
推送到您注入
MyLogic的另一个类中
然后可以模仿。@nkosi我认为我已经非常彻底和简洁了,我没有意识到遗漏了什么。也许你认为遗漏了什么是我试图解决的问题的原因?@juharr我正在尝试在
AreSettingsValid()中测试逻辑验证
是正确的。此方法验证属性是否已在同一方法中设置。属性定义在哪里?它是静态的吗?正如其他人所指出的,由于您正在模拟所有内容,因此不清楚您测试的类是什么。此示例不完整。请提供一个示例,说明您不应该将模拟用作t下的代码est。似乎您真正想要测试的是
MyLogic
,但模拟需要某种类型包装的
属性。也许可以将
GetSettings
推到另一个类中,您可以将其注入
MyLogic
,然后模拟。@nkosi我认为我已经非常彻底和简洁,我不是一个警惕任何缺失的东西。也许你认为缺失的东西就是我试图解决的问题的原因?@juharr我试图在
AreSettingsValid()中测试逻辑验证
是正确的。此方法验证属性是否已在同一个方法中设置。
属性定义在哪里?它是静态的吗?正如其他人所指出的,不清楚您测试的类是什么,因为您正在模拟所有内容。我认为您的命名有点不正确。这对于
MySettings
处理
GetSetting
MyLogic
处理
AreSettingsValid
,否则这或多或少就是OP应该做的。哈哈!非常正确!我会更新答案的。谢谢你让我知道:)我觉得你的名字有点不对劲。
MySettings
处理
GetSetting
MyLogic
处理
AreSettingsValid
,这会更有意义,但否则这或多或少就是OP应该做的。哈哈!非常正确!我会更新答案。谢谢你让我知道:)