gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:38:07 26 4
gpt4 key购买 nike

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

测试

[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 测试代码?

附言。 NpgsqlConnection 是到 PostgreSQL 服务器的连接。

最佳答案

您的方法存在一些问题:

  1. NpgsqlConnection 是一个类,我的猜测是状态属性不是虚拟的 - 因此您创建的 stub 将无法正常工作(正如您所注意到的那样0。我认为没有任何解决方法。
  2. 在您的测试中,您实际上是在测试 NpgsqlCommand 的内部结构(因为您在 ExecuteProcedure 方法中创建了一个具体的实现)。这是一个第三方类,您应该只假设有关其文档化接口(interface)的任何内容,而不是实现细节(例如,它在连接时使用 State 属性)

所以我的方法是不对此类运行任何单元测试,因为它实际上只是第 3 方库的包装器。改为进行集成测试(因此创建一个测试数据库并连接到它)。

关于c# - 使用 Rhino Mocks 对 NpgsqlCommand 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2453215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com