我是单元测试的新手,我在ASP.NET MVC中使用Rhino Mock
我用这段代码创建了一个主测试类:
[TestFixture]
public class PersistenceTest
{
[Test]
protected T SaveAndLoadEntity<T>(T entity) where T : BaseEntity
{
var mockDataSource = MockRepository.GenerateMock<IRepository<T>>();
mockDataSource.Add(entity);
var fromDb = mockDataSource.FindBy(entity.Id);
return fromDb;
}
}
并创建一个这样的客户测试类:
[TestFixture]
public class CustomerTests : PersistenceTest
{
[Test]
public void Can_Save_And_Load_Customer()
{
var customer = new Customer()
{
Id = 12,
Name = "Reza",
Family = "Pazooki",
Company = "Rozaneh",
Email = "ipazooki@gmail.com",
Mobile = "09352463668",
Fax = "021-44869059",
Tel = "021-44869059",
WebSite = "www.rozanehmedia.com"
};
var fromDb = SaveAndLoadEntity(customer);
fromDb.ShouldNotBeNull();
}
}
但是在运行代码时,它表示来自Database的返回值为NULL !!!
我不知道我的代码有什么问题,但我从模拟存储库中保存并检索数据,似乎每件事都没问题。
tnx在转发方面提供任何帮助:)
答案 0 :(得分:1)
Mocks用于记录对象的调用以进一步验证或在调用时提供值(以后的行为需要设置)。
在SaveAndLoadEntity
方法中,您可以调用mock(Add
和FindBy
)。由于mock是一个没有实际行为的虚假对象,这些调用什么都不做(它们不会保存或从数据库中提取任何实体)。
如果你想测试持久层,你应该对真正的数据库实例(或者可选地, in-memory )进行测试。
// [Test] attribute is not needed
protected T SaveAndLoadEntity<T>(T entity) where T : BaseEntity
{
var dataSource = new DataSource("connection string");
dataSource.Add(entity);
var fromDb = dataSource.FindBy(entity.Id);
return fromDb;
}
目前您正在拨打 not-setup mock ,但没有取得任何成效。
答案 1 :(得分:0)
谢谢jimmy_keen。
我根据你的建议更改我的代码并且效果很好:)
[TestFixture]
public class PersistenceTest
{
protected ISession Session;
protected ITransaction Transaction;
[SetUp]
public void SetUp()
{
var helper = new NHibernateHelper("...connectionString....");
Session = helper.SessionFactory.OpenSession();
Transaction = Session.BeginTransaction();
}
protected T SaveAndLoadEntity<T>(T entity) where T : BaseEntity
{
Session.Save(entity);
Transaction.Commit();
var fromDb = Session.Get<T>(entity.Id);
return fromDb;
}
}