我一直在将一些旧规范转换为MSpec (使用NUnit/ specs )。规范是针对视图模型的,所讨论的视图模型进行了一些自定义安全检查。我们的规范中有一个帮助方法,它将为Thread.CurrentPrincipal设置假的安全凭据。这在旧的单元测试中运行良好,但在MSpec中失败。具体来说,我得到了一个例外:
未解析成员的"System.Runtime.Serialization.SerializationException:
类型“
当SUT的一部分试图读取app配置文件时,就会发生这种情况。如果我注释掉设置CurrentPrincipal的行(或者只是在检查配置文件的部分之后调用它),错误就会消失,但是测试由于缺少凭据而失败。
类似地,如果我将CurrentPrincipal设置为null,错误就会消失,但是测试再次失败,因为没有设置凭据。我在谷歌上找到了一些关于确保自定义主体在跨越AppDomain边界时是可串行化的帖子(通常是在web应用程序中)。在我们的例子中,这不是一个网络应用程序,我不会跨越任何AppDomains。我们的枕叶对象也是可序列化的。
我下载了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的行为特性。这个特定的类模拟用户从(WPF)控件中选择绑定到这个VM的东西。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是一个企业库对象,它试图访问配置。
发布于 2010-04-03 21:51:17
有关测试运行失败的答案,请参见this question。
https://stackoverflow.com/questions/2240459
复制相似问题