我已经把一些旧的规范,以MSpec(使用NUnit的/ SpecUnit)。 该规范是一个视图模型,并在问题视图模型做了一些自定义的安全检查。 我们有我们的规格为其中Thread.CurrentPrincipal中设置将假安全凭证的helper方法。 这个工作在旧单元测试正常,但在MSpec失败。 具体来说,我得到这个异常:
“System.Runtime.Serialization.SerializationException:类型未解决的成员”
它发生在当SUT的一部分,试图读取应用程序配置文件。 如果我注释掉这台CurrentPrincipal行(或者干脆叫它,检查配置文件中的部分后),错误消失,但测试失败是由于缺乏凭据。
同样,如果我设置CurrentPrincipal为null,错误消失,但再次测试失败,因为该证书未设置。 我GOOGLE了这一点,并发现关于确保定制主要是序列化时,它穿过的AppDomain边界(通常参考Web应用程序)的一些职位。 在我们的例子中,这不是一个Web应用程序,而且我不会交叉任何应用程序域。 我们pincipal对象也可序列化。
我下载的源MSpec,并发现ConsoleRunner调用一个名为AppDomainRunner类。 我还没有调试到它,但它看起来像它的运行在不同的应用程序域的规格。
因此,没有人对我怎样才能解决这个任何想法? 我真的很喜欢MSpec,并希望只使用它。 不过,我需要能够在运行测试,以提供虚假的安全证书。
这里的规范类:
[Subject(typeof(CountryPickerViewModel))]
public class When_the_user_makes_a_selection : PickerViewModelSpecsBase
{
protected static CountryPickerViewModel picker;
Establish context = () =>
{
SetupFakeSecurityCredentials();
CreateFactoryStubs();
StubLookupServicer<ICountryLookupServicer>()
.WithData(BuildActiveItems(new [] { "USA", "UK" }));
picker = new CountryPickerViewModel(ViewFactory, ViewModelFactory,
BusinessLogicFactory, CacheFactory);
};
Because of = () =>
picker.SelectedItem = picker.Items[0];
Behaves_like<Picker_that_has_a_selected_item> a_picker_with_a_selection;
}
我们有许多这样的“选择器”视图模型,所有这些都表现出一些共同的行为。 所以我使用MSpec的行为特征。 此特定类模拟用户选择从被绑定到该VM的(WPF)控制的东西。 该SetupFakeSecurityCredentials()方法简单地设置到Thread.CurrentPrincipal中我们定义主体,其中prinipal已填充将完全访问权限的实例。
这里有一个假的CountryPickerViewModel这足以导致错误:
public class CountryPickerViewModel
{
public CountryPickerViewModel(IViewFactory viewFactory,
IViewModelFactory viewModelFactory,
ICoreBusinessLogicFactory businessLogicFactory,
ICacheFactory cacheFactory)
{
Items = new Collection<int>();
var validator = ValidationFactory.CreateValidator<object>();
}
public int SelectedItem { get; set; }
public Collection<int> Items { get; private set; }
}
这是ValidationFactory调用,它炸毁。 ValidationFactory是企业库对象,尝试访问配置。