您好我正在为流利的Nhibernate编写单元测试,当我在isloation中运行测试时它会通过,但是当我运行多个测试时。或者多次运行测试它开始失败并显示以下消息 System.ApplicationException:对于属性'Id',期望'1'类型'System.Int32'但是得到'2'类型'System.Int32'
[TextFixture] public void Can_Correctly_Map_Entity() {
new PersistenceSpecification<UserProfile>(Session)
.CheckProperty(c => c.Id, 1)
.CheckProperty(c => c.UserName, "user")
.CheckProperty(c => c.Address1, "Address1")
.CheckProperty(c => c.Address2, "Address2")
}
答案 0 :(得分:1)
Id属性是一个数据库标识,因此每次插入表时它都会递增。其他一些测试也是插入UserProfile,因此此插入的标识值增加到2。我只是验证Id属性不等于0,假设它是默认值。
答案 1 :(得分:0)
我建议使用内存数据库测试您的映射,以便您可以仅将这些测试与映射隔离开来。如果使用内存数据库,则可以将FluentConfiguration放在[TestInitialize](MSTest)或[SetUp](NUnit)方法中,并且每次都会从头开始(在内存中)创建db。这是一个例子:
[TestInitialize]
public void PersistenceSpecificationTest()
{
var cfg = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.InMemory().UseReflectionOptimizer())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserProfile>())
.BuildConfiguration();
_session = cfg.BuildSessionFactory().OpenSession();
new SchemaExport(cfg).Execute(false, true, false, _session.Connection, null);
}
然后,每次运行时,您的测试都可以正常运行:
[TestMethod]
public void CanMapUserProfile()
{
new PersistenceSpecification<UserProfile>(_session)
.CheckProperty(c => c.Id, 1)
.CheckProperty(c => c.UserName, "user")
.CheckProperty(c => c.Address1, "Address1")
.CheckProperty(c => c.Address2, "Address2")
}
您需要在此方案中使用SQLite以及System.Data.SQLite DLL,您可以在此处找到它:http://sqlite.phxsoftware.com/
希望有所帮助。