首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MSpec为更改Thread.CurrentPrincipal的代码编写规范?

如何使用MSpec为更改Thread.CurrentPrincipal的代码编写规范?
EN

Stack Overflow用户
提问于 2010-02-10 21:24:29
回答 1查看 626关注 0票数 1

我一直在将一些旧规范转换为MSpec (使用NUnit/ specs )。规范是针对视图模型的,所讨论的视图模型进行了一些自定义安全检查。我们的规范中有一个帮助方法,它将为Thread.CurrentPrincipal设置假的安全凭据。这在旧的单元测试中运行良好,但在MSpec中失败。具体来说,我得到了一个例外:

未解析成员的"System.Runtime.Serialization.SerializationException:

类型“

当SUT的一部分试图读取app配置文件时,就会发生这种情况。如果我注释掉设置CurrentPrincipal的行(或者只是在检查配置文件的部分之后调用它),错误就会消失,但是测试由于缺少凭据而失败。

类似地,如果我将CurrentPrincipal设置为null,错误就会消失,但是测试再次失败,因为没有设置凭据。我在谷歌上找到了一些关于确保自定义主体在跨越AppDomain边界时是可串行化的帖子(通常是在web应用程序中)。在我们的例子中,这不是一个网络应用程序,我不会跨越任何AppDomains。我们的枕叶对象也是可序列化的。

我下载了MSpec的源代码,发现ConsoleRunner调用了一个名为AppDomainRunner的类。我还没有调试过它,但看起来它在不同的应用程序域中运行规范。

那么,有没有人知道我如何克服这个问题呢?我真的很喜欢MSpec,并且很乐意专门使用它。但我需要能够在运行测试时提供假的安全凭证。

下面是规范类:

代码语言:javascript
复制
[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,它足以导致错误:

代码语言:javascript
复制
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是一个企业库对象,它试图访问配置。

EN

回答 1

Stack Overflow用户

发布于 2010-04-03 21:51:17

有关测试运行失败的答案,请参见this question

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2240459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档