使用Rhino Mocks对NpgsqlCommand进行单元测试

时间:2010-03-16 09:32:26

标签: c# postgresql nunit rhino-mocks npgsql

我的单元测试不断收到以下错误:“System.InvalidOperationException:Connection未打开。”

测试

[TestFixture]
public class Test
{
   [Test]
    public void Test1()
    {
        NpgsqlConnection connection = MockRepository.GenerateStub<NpgsqlConnection>();

        // Tried to fake the open connection
        connection.Stub(x => x.State).Return(ConnectionState.Open);
        connection.Stub(x => x.FullState).Return(ConnectionState.Open);

        DbQueries queries = new DbQueries(connection);

        bool procedure = queries.ExecutePreProcedure("201003");

        Assert.IsTrue(procedure);
    }
}

受测试代码

using System.Data;
using Npgsql;

public class DbQueries
{
    private readonly NpgsqlConnection _connection;

    public DbQueries(NpgsqlConnection connection)
    {
        _connection = connection;
    }

    public bool ExecutePreProcedure(string date)
    {
        var command = new NpgsqlCommand("name_of_procedure", _connection);
        command.CommandType = CommandType.StoredProcedure;

        NpgsqlParameter parameter = new NpgsqlParameter {DbType = DbType.String, Value = date};

        command.Parameters.Add(parameter);
        command.ExecuteScalar();

        return true;
    }
 }

您如何使用Rhino Mocks 3.6测试代码?

PS。 NpgsqlConnection是与PostgreSQL服务器的连接。

1 个答案:

答案 0 :(得分:1)

您的方法存在一些问题:

  1. NpgsqlConnection是一个类,我的猜测是状态属性不是虚拟的 - 所以你创建的存根不会起作用(正如你所注意到的那样。我认为没有任何解决方法。
  2. 在您的测试中,您确实正在测试NpgsqlCommand的内部(因为您在ExecuteProcedure方法中创建了一个具体的实现)。这是第三方类,您应该只假设其文档化的接口,而不是实现细节(例如,它在连接时使用State属性)
  3. 所以我的方法是不对这个类运行任何单元测试,因为它实际上只是第三方库的包装器。转而进行集成测试(因此创建一个测试数据库并连接到它)。