Nsubsitute mocking AS/IS .net



我很难嘲笑IDbConnection。我有一个返回IDbConnection的方法,但我要检查这个连接是否是NpgsqlConnection,如下所示:

if (conn as NpgsqlConnection == null)
{
throw new System.Exception("error");
}

当方法返回mock对象时,强制转换(as(返回null并创建异常。我如何使用NSubsiute,以便它将其视为NpgsqlConnection对象?

接下来的第二个问题是,如果这个问题可以解决的话,我使用的是NpgsqlConnection中的BeginBinaryImport,它没有接口,我不能模拟它,我怎么能伪造它,这样它在像这样使用using var importer = conn.BeginBinaryImport("COPY.....时就不会抛出错误?

这取决于您实际想要测试的内容。如果您还想测试NpgsqlConnection的功能,您可以创建一个带有测试连接字符串的NpgsqlConnection。

public void DoSomething()
{
// returns NpgsqlConnection with test connection string
// If you substituted for a class rather than an interface, check that the call to your substitute was on a virtual/abstract member.
IDbConnection conn = _connectionManager.GetConnection(); 
if (conn as NpgsqlConnection == null)
{
throw new System.Exception("error");
}
// functionality
using (var writer = (conn as NpgsqlConnection).BeginBinaryImport("COPY data (field_text, field_int4) FROM STDIN BINARY"))
{
// do some stuff
}
}

给。您可以使_connectionManager.GetConnection();返回一个测试数据库连接,该连接是一个NpgsqlConnection。这样你就可以测试代码了。

你可以这样设置:

var testConnection = new NpgsqlConnection("TESTCONNECTIONSTRING");
var conn = Substitute.For<ConnectionManager>();
conn.GetConnection().Returns(testConnection);

否则,您需要一个从调用代码中抽象功能的依赖项。你不需要太担心依赖性在做什么。

你的代码可以是这样的:

public void DoSomething()
{
IDbConnection conn = _connectionManager.GetConnection(); // returns NpgsqlConnection
_npgsqlConnectionHelper.ValidateConnection(conn);
_npgsqlConnectionHelper.DoFunctionality(conn);
}

在这里,您可以模拟_npgsqlConnectionHelper

相关内容

  • 没有找到相关文章

最新更新