我在另一个问题上写过这个话题.
但是,我已经重构了我的代码以摆脱配置访问,从而允许规范通过.或者我想.它们使用TestDriven.Net在Visual Studio中运行良好.但是,当我使用mspec.exe工具在rake中运行它们时,它们仍会因序列化异常而失败.所以我创建了一个完全自包含的示例,除了在线程上设置虚假安全凭证之外基本上什么也没做.这个测试在TD.Net中正常通过,但在mspec.exe中爆炸了.有人有什么建议吗?
更新:我发现了解决方法.在研究了这个问题后,似乎原因是包含我的主要对象的程序集与mspec.exe不在同一个文件夹中.当mspec创建一个新的AppDomain来运行我的规范时,新的AppDomain必须使用主体对象加载程序集以反序列化它.该程序集与mspec EXE不在同一文件夹中,因此失败.如果我将我的程序集复制到与mspec相同的文件夹中,它可以正常工作.
我仍然不明白为什么ReSharper和TD.Net能够正常运行测试?他们不使用mspec.exe来实际运行测试吗?
using System;
using System.Security.Principal;
using System.Threading;
using Machine.Specifications;
namespace MSpecTest
{
[Subject(typeof(MyViewModel))]
public class When_security_credentials_are_faked
{
static MyViewModel SUT;
Establish context = SetupFakeSecurityCredentials;
Because of = () =>
SUT = new MyViewModel();
It should_be_initialized = () =>
SUT.Initialized.ShouldBeTrue();
static void SetupFakeSecurityCredentials()
{
Thread.CurrentPrincipal = CreatePrincipal(CreateIdentity());
}
static MyIdentity CreateIdentity()
{
return new MyIdentity(Environment.UserName, "None", true);
}
static MyPrincipal CreatePrincipal(MyIdentity identity)
{
return new MyPrincipal(identity);
}
}
public class MyViewModel
{
public MyViewModel() …Run Code Online (Sandbox Code Playgroud)