我正在编写C#测试代码和其中的新代码。有点困惑,需要帮助。这是骨架代码,而不是完整代码。我正在寻找一种解决方案,可以通过不同的方法使test_dict密钥IP和主机保持不变,并且仅更新NET_MSG值。
public partial testclass
{
IDictionary<string, string> test_dict= new Dictionary<string, string>();
String ping_msg
private void test1()
{
test_dict = develop.AddPing(ping_msg)
}
每次我通过以下方法在test_dict["NET_MSG"]
中添加一条新消息并打印test_dict
时,我在test_dict
中仅得到一个密钥,即test_dict["NET_MSG"]
,而我却没有请参阅IP地址和主机。
我很困惑,因为我使用的是全局字典变量,并且一旦从test_dict
调用test1()
时,test_dict
的三个键NET_MSG
都会正确, IP
和HOST
。那么,为什么每次在NET_MSG
方法中仅更改call_test
键的值时,我都会丢失另外两个键IP
和HOST
?
public void call_test1()
{
test_dict["NET_MSG"] = "Putting new message";
}
public void call_test2()
{
test_dict["NET_MSG"] = "Putting new message 2";
}
public void call_test3()
{
test_dict["NET_MSG"] = "Putting new message3";
}
在另一个文件中:
public static class develop
{
public static IDictionary<string, string> AddPing(String message)
{
IDictionary<string, string> new_ping = new Dictionary<string, string>();
new_ping["NET_MSG"] = message
new_ping["IP"] = "192.168.111.111"
new_ping["HOST"] = "some_host_name"
return new_ping
}
}
请对此提供帮助,对于该问题的任何解决方案都将不胜感激。
答案 0 :(得分:0)
我认为您缺少有关创建新字典的信息。
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TrieQuestions
{
[TestClass]
public class UnitTest2
{
//1st new of Dictionary
IDictionary<string, string> test_dict= new Dictionary<string, string>();
private String ping_msg;
[TestMethod]
public void TestMethod1()
{
test_dict = develop.AddPing(ping_msg);
test_dict["NET_MSG"] = "Putting new message";
}
}
public static class develop
{
public static IDictionary<string, string> AddPing(String message)
{
//another new instance of the dictionary is created!!
IDictionary<string, string> new_ping = new Dictionary<string, string>();
new_ping["NET_MSG"] = message;
new_ping["IP"] = get_IP();
new_ping["HOST"] = get_host();
return new_ping;
}
private static string get_host()
{
return "host";
}
private static string get_IP()
{
return "ip";
}
}
}
我为您创建了此测试代码,因此您了解丢失的内容。
如果您在单元测试中调用代码,它将为您工作。 但是,请注意我添加的注释,您将分配两次新字典,第一次调用该测试,再次在您的静态类内部分配,因此这意味着如果您写第一个分配的字典,则会看到一个空字典。
如果您在调试模式下将test_dict添加到监视列表中,则还可以使用make object Id命令来查看您是否正在创建新实例。
如果要解决问题,可以将原始字典作为参数传递给函数。
public static void AddPing(String message, IDictionary<string, string> dict)
{
dict["NET_MSG"] = message;
dict["IP"] = get_IP();
dict["HOST"] = get_host();
}
或者请分享您的更多代码,以便我关注您的流程。
答案 1 :(得分:0)
我创建了一个简单的控制台应用程序,目的只是向您展示如何修改test_dict
值:
class Program
{
static void Main(string[] args)
{
var foo = new Testclass();
foo.test1();
Display(foo);
foo.call_test1();
Display(foo);
foo.call_test2();
Display(foo);
foo.call_test3();
Display(foo);
foo.call_test4();
Display(foo);
}
private static void Display(Testclass foo)
{
foreach (var item in foo.test_dict)
{
Console.WriteLine(item.Value + item.Key);
}
Console.WriteLine();
}
}
public partial class Testclass
{
public IDictionary<string, string> test_dict = new Dictionary<string, string>();
private String ping_msg;
public void test1()
{
test_dict = Develop.AddPing(ping_msg);
}
// chnages only NET_MSG value, other test_dict fields stay untouched!!!
public void call_test1()
{
test_dict["NET_MSG"] = "Putting new message";
}
// chnages only NET_MSG value, other test_dict fields stay untouched!!!
public void call_test2()
{
test_dict["NET_MSG"] = "Putting new message 2";
}
// chnages only NET_MSG value, other test_dict fields stay untouched!!!
public void call_test3()
{
test_dict["NET_MSG"] = "Putting new message3";
}
// here you can change all the fields
public void call_test4()
{
test_dict["NET_MSG"] = "new net_msg value";
test_dict["IP"] = "new ip value";
test_dict["HOST"] = "new host value";
}
}
public static class Develop
{
public static string get_IP()
{
return "blah";
}
public static string get_host()
{
return "blah2";
}
public static IDictionary<string, string> AddPing(String message)
{
return new Dictionary<string, string>()
{
{"NET_MSG", message},
{"IP", get_IP()},
{"HOST", get_host()}
};
}
}
因此,您应该收到:
NET_MSG
blahIP
blah2HOST
Putting new messageNET_MSG
blahIP
blah2HOST
Putting new message 2NET_MSG
blahIP
blah2HOST
Putting new message3NET_MSG
blahIP
blah2HOST
new net_msg valueNET_MSG
new ip valueIP
new host valueHOST
调用call_test1
,call_test2
或call_test3
只是在更改NET_MSG。其他test_dict
字段保持不变。希望它能对您有所帮助。如果您调用call_test4
方法,则将更改test_dict
字典的所有已定义值。
答案 2 :(得分:0)
如果测试类如下:
public partial testclass
{
IDictionary<string, string> test_dict= new Dictionary<string, string>();
String ping_msg
private void test1()
{
test_dict = develop.AddPing(ping_msg)
}
public void call_test1()
{
test_dict["NET_MSG"] = "Putting new message";
}
public void call_test2()
{
test_dict["NET_MSG"] = "Putting new message 2";
}
public void call_test3()
{
test_dict["NET_MSG"] = "Putting new message3";
}
}
问题在于,test1()
从未被调用来填充初始词典,因此初始词典为空且行数
test_dict["NET_MSG"] = "Putting new message1";
test_dict["NET_MSG"] = "Putting new message2";
test_dict["NET_MSG"] = "Putting new message3";
正在空字典中创建键“ NET_MSG”。
要填充并且仅更改NET_MSG,请向test1()
添加一个调用,以将test_dict
设置为要使用的字典,而不是空字典。
还请记住,如果每次都实例化一个新类,则每次都必须调用test1()
。
示例1:
public void call_test1() {
test1();
test_dict["NET_MSG"] = "Putting new message1";
}
用法:
testclass test = new testclass(<ctor args>);
test.call_test1();
它将填充然后更改NET_MSG
示例2:
public void init() {
test1();
}
public void call_test1() {
test_dict["NET_MSG"] = "Putting new message1";
}
用法:
testclass test = new testclass(<ctor args>);
test.init();
test.call_test1();
这在识别正在发生的事情时更加明确-发生了初始化,因此在call_*
方法有用之前初始化了数据。
您甚至可以:
testclass test = new testclass(<ctor args>);
test.init();
test.call_test1();
//Do something with the data
test.call_test2();
//Do something with the data
test.call_test3();
//Do something with the data
然后您一次初始化,call_ *将使用相同的词典,并且仅更改“ NET_MSG”值。