我正在写一个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
}
}
请帮助我,并解决问题的任何解决方案。
我认为你在创建一个新词典时缺少一些东西。
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
method,您将更改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();
这在确定发生了什么时更加明确 - 初始化发生,因此在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”值。