如何解决替代模拟 AS/IS .net
我很难嘲笑 IDbConnection
。我有一个返回 IDbConnection
的方法,但我有一个检查来验证此连接是否是 NpgsqlConnection
像这样:
if (conn as NpgsqlConnection == null)
{
throw new System.Exception("error");
}
而 while 方法返回模拟对象,cast(as
) 返回 null 并创建异常。如何使用 NSubsiute 以便将其视为 NpgsqlConnection
对象?
接下来的第二个问题,如果这个问题可以解决,我正在使用 BeginBinaryImport
中的 NpgsqlConnection
,它没有接口,我无法模拟它,我怎么能伪造它,所以像这样使用时不会抛出错误 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。