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应该做的。哈哈!非常正确!我会更新答案。谢谢你让我知道:)