我正在使用Microsoft Fakes和一些垫片测试遗留代码。 为了在共享资源的访问中测试并发性,我必须创建一些AppDomains,我将其传递给它们的上下文。 这不能仅用线程来完成,因为垫片不是线程安全的。 我还希望在将该上下文返回到主AppDomain时,我可以将该数据用于测试期望。
我的夹具的一个属性是一个字典,我在我的垫片内更新遗留代码。 我遇到的问题是我无法更新字典的值。
在这个方法中,我修改了一个写入注册表的静态类:
public static void ShimRegistry(PlafondManagerTestFixtureUser fixture)
{
Common.Util.Fakes.ShimRegistryHelper.SetLocalMachineRegistrySettingStringStringString = (parent, key, value) => {
if (fixture.Registries != null)
{
var quant = Decrypt(value);
if (fixture.Registries.ContainsKey(key))
fixture.Registries[key] = quant;
else
fixture.Registries.Add(key, quant);
}
return null;
};
Common.Util.Fakes.ShimRegistryHelper.GetLocalMachineRegistrySettingStringStringString = (parent, key, value) => {
string val;
fixture.Registries.TryGetValue(key, out val);
return Encrypt(val);
};
}
当我调试这个时,我可以看到
fixture.Registries[key] = quant;
之前我有“0”作为字典条目的值和quant
中的“2”。
运行该行后,字典条目仍然显示为“0”。
我坚持这个,我在堆栈溢出时找不到类似的问题(或者我找不到合适的词来形容它)。
此设置的其他部分工作正常。我可以在主线程上收到更新的字符串,所以我怀疑这与我在AppDomains之间共享实例有什么关系。
有人能帮我找错吗?
更新 正如Jon Skeet建议的那样,我在mstest,appdomain,shims的上下文之外测试了这个,甚至在错误的代码之前。 在每种情况下它都按预期工作,因此它可能与在夹具中的AppDomains之间共享字典有关。
这是我以前测试的:
Dictionary<string, string> test = new Dictionary<string, string>
{
{ "Key", "Value" }
};
test["Key"] = "Value2";
我有这种感觉,我错过了一些愚蠢的小事,但似乎无法找到它是什么。
更新2: 管理以减少将字典传递到另一个AppDomain的问题。
Here's我放在Github上的示例控制台项目;
更新3: 既然我有更具体的搜索内容,我发现这个答案对我有帮助:Adam Ralph's answer to 'Sharing data between AppDomains'
我打赌要串行化为字符串,因为我已经有办法轻松完成了,但仍然想了解为什么会发生这种情况。