【发布时间】:2011-09-16 12:59:04
【问题描述】:
我的 Windows Phone 7 项目中的一个 NUnit 测试一直失败,并出现以下错误:
Error 4 Test 'MyProject.Tests.Unit.Service.TaskServiceTests.Save_CallsWebService_WhenCalledWithTaskAndSession' failed: System.IO.FileNotFoundException : Could not load file or assembly 'System.Runtime.Serialization, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. The system cannot find the file specified.
at Newtonsoft.Json.Serialization.DefaultContractResolver.InitializeContract(JsonContract contract)
at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\DefaultContractResolver.cs:line 279
at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\DefaultContractResolver.cs:line 545
at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\DefaultContractResolver.cs:line 188
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.GetContractSafe(Object value) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 84
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalWriter.cs:line 67
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\JsonSerializer.cs:line 451
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, Formatting formatting, JsonSerializerSettings settings) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\JsonConvert.cs:line 591
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\JsonConvert.cs:line 528
at MyProject.Core.Utility.Extensions.ToJson(Object value) in C:\Workspace\MyProject\MyProject.Service\Utility\Extensions.cs:line 15
at MyProject.Service.Service.TaskService.Save(Task task, ISession session) in C:\Users\jearl\Dropbox\Code\Workspace\MyProject\MyProject.Service\Service\TaskService.cs:line 34
at MyProject.Tests.Unit.Service.TaskServiceTests.Save_CallsWebService_WhenCalledWithTaskAndSession() in C:Workspace\MyProject\MyProject.Tests.Unit\Service\TaskServiceTests.cs:line 43 C:\Workspace\MyProject\MyProject.Service\Utility\Extensions.cs 15
问题是由我编写的扩展方法引起的,该方法使用 JSON.NET 将 POCO 序列化为 JSON。 JSON.NET 似乎依赖于 System.Runtime.Serialization。
我尝试将 JSON.NET 和 System.Runtime.Serialization 引用都添加到我的测试项目中,但这并没有解决问题。
我正在测试的程序集使用 RestSharp,而后者又依赖于 JSON.NET。我也尝试将 System.Runtime.Serialization 的引用直接添加到正在测试的程序集中,但这也失败了。
有什么建议吗?
更新:我正在尝试按照以下 cmets 中的建议追踪文件,但 Filemon 已停用。它的替代品 Process Explorer 没有帮助,因为它似乎只显示当前由 devenv.exe 进程保持打开的文件。搜索对有问题文件的引用只会产生两个不相关的引用。有没有办法查看我的测试运行记录,以便我知道它在哪里寻找 .dll?
更新 2:感谢您的建议。我通过使用 Nuget 将 RestSharp 和 JSON.NET 引用直接添加到单元测试项目中解决了 IO 问题。现在我收到以下错误:
Error 5 Test 'MyProject.Tests.Unit.Service.TaskServiceTests.Save_CallsWebService_WhenCalledWithTaskAndSession' failed: System.InvalidProgramException : Common Language Runtime detected an invalid program.
at System.Xml.Linq.XDocument..ctor()
at RestSharp.Serializers.XmlSerializer.Serialize(Object obj)
at RestSharp.RestRequest.AddBody(Object obj, String xmlNamespace)
at RestSharp.RestRequest.AddBody(Object obj)
at MyProject.Service.Service.TaskService.Save(Task task, ISession session) in C:\MyProject\MyProject.Service\Service\TaskService.cs:line 34
at MyProject.Tests.Unit.Service.TaskServiceTests.Save_CallsWebService_WhenCalledWithTaskAndSession() in C:\MyProject\MyProject.Tests.Unit\Service\TaskServiceTests.cs:line 43 C:\MyProject\MyProject.Service\Service\TaskService.cs 34
在此搜索网络主要返回对 TFS 开发的引用。太好了。
【问题讨论】:
-
使用 filemon 实用程序(由 sysinternals 提供)并查看正在发生的事情以及试图找到上述文件的进程在哪里。
-
您可以尝试从 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\System.Runtime.Serialization.dll 本地复制它,并且然后确保项目引用是本地的。
标签: c# windows-phone-7 nunit testdriven.net restsharp