我在另一个问题上写过这个话题.
但是,我已经重构了我的代码以摆脱配置访问,从而允许规范通过.或者我想.它们使用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) 我使用mspec进行测试,并在测试中使用SQLite x86进行NHiernate安装.问题是,当我使用mspec r#runner运行我的测试时,一切正常但从控制台运行它会发现一个错误,它无法找到sqlite dll.
我的规范项目配置:
.net 4
x86(使用x86版本的sqlite)
System.Data.SQLite,Version = 1.0.64.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139 mspec,Version = 0.3.0.0,Culture = neutral,PublicKeyToken = null,target runtime:v4.0.30319,target:x86
MSpec是从源代码构建的.在Reflector中,mspec.exe显示为为x86构建 - 这似乎适合我的设置,并且所述测试使用r#runner正常运行.
NHibernate.HibernateException:无法从NHibernate.Driver.SQLite20Driver,NHibernate,Version = 2.1.2.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4创建驱动程序.---> System.Reflection.TargetInvocationException:调用目标抛出了异常.---> NHibernate.HibernateException:找不到程序集System.Data.SQLite中的IDbCommand和IDbConnection实现.确保程序集System.Data.SQLite位于应用程序目录或全局程序集缓存中.如果程序集位于GAC中,请使用应用程序配置文件中的元素指定程序集的全名.在NHibernate.Driver.SQLite20Driver..ctor()的NHibernate.Driver.ReflectionBasedDriver..ctor(String driverAssemblyName,String connectionTypeName,String commandTypeName)
有谁知道如何解决这个问题?
感谢提前和多云维也纳的问候,
克里斯
当我编写这样的 MSpec 上下文时:
[Subject(typeof(TheType), "Concern")]
internal class when_this_test_is_run
{
Establish context = () =>
{
// some code...
};
Because of = () => Do.Something();
It should_do_this;
It should_do_that;
}
Run Code Online (Sandbox Code Playgroud)
当我让 ReSharper 重新格式化代码时,它总是在任何作为匿名方法的委托下方插入一个空行,即以块{作为}其主体。它不会在简单表达式的委托后面插入空行。因此,在上面的示例中,Establish context委托会生成一个空行,但Because of和It委托不会。
这让我发疯,因为我不希望它插入空行,但我不知道需要更改什么设置来阻止它发生。
有任何想法吗?
我有一个单元测试我想写.
我将此部分作为工作版本的一部分:
List<MyClass> queryResult = new List<MyClass>(){};
A.CallTo(() => _dataContext.GetAll<MyClass>()).Returns(queryResult.AsQueryable());
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿使用"null"而不是"queryResult.AsQueryable()"之类的东西,那么就没有必要创建一个空列表.
但GetAll将根据事物的外观返回一个空或满的列表.因此,null将不起作用.
是否有类似"List.Empty"的东西我可以使用?
谢谢