从MockRepository中检索数据?

时间:2014-02-08 11:01:25

标签: unit-testing testing mocking

我是单元测试的新手,我在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在转发方面提供任何帮助:)

2 个答案:

答案 0 :(得分:1)

Mocks用于记录对象的调用以进一步验证或在调用时提供值(以后的行为需要设置)。

SaveAndLoadEntity方法中,您可以调用mock(AddFindBy)。由于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;
    }
}