开发者

Unit Test For NpgsqlCommand With Rhino Mocks

My unit test keeps getting the following error: "System.InvalidOperationException: The Connection is not open."

The Test

[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);
    }
}

Code Under Test

using System.Data;
using Npgsql;

public class DbQueries
{
    private readonly NpgsqlConnection _connection;

    public DbQueries(NpgsqlConnection connection)
    {
        _connec开发者_StackOverflow中文版tion = 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;
    }
 }

How would you test the code using Rhino Mocks 3.6?

PS. NpgsqlConnection is a connection to a PostgreSQL server.


There are a few issues with your approach:

  1. NpgsqlConnection is a class, and my guess is that the state properties are not virtual - so the stub you created is just not going to work (as you noticed0. I don't think there is any workaround.
  2. In your test you are really testing the internals of NpgsqlCommand (because you create a concrete implementation in ExecuteProcedure method). This is a third party class and you should only assume anything about its documented interface, and not the implementation details (e.g. that it uses State property on connection)

So my approach would be to not run any unit tests for this class, because its effectively just a wrapper around a 3rd party library. Go for integration tests instead (so create a test database and connect to it).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜