我正在编写一个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地址和主机。
我很困惑,因为我使用的是全局字典变量,一旦从test1()
调用test_dict
,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;
}
}
请帮助我解决这个问题,并希望解决问题的任何解决方案。
我认为您缺少有关创建新字典时的内容。
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();
}
或者请分享更多您的代码,以便我可以遵循您的流程。
我创建了一个简单的控制台应用程序,只是为了向您展示如何修改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
字典的所有定义值。
如果测试类如下所示:
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();
这在识别正在发生的事情时更明确一些 - 发生 init,以便在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"值。