gpt4 book ai didi

unit-testing - ServiceStack 服务的单元测试

转载 作者:行者123 更新时间:2023-12-04 05:29:58 25 4
gpt4 key购买 nike

我正在尝试为 ServiceStack 服务编写简单的单元测试,我正在通过他们在线的测试和这里的几个线程。这是我想要完成的大部分细节的主线程 - Unit Test HTTPRequest Headers with ServiceStack .

但是,我在将 IDbConnection 对象注入(inject)服务时遇到了问题。在 web 方法中,使用 OrmLite 的 GetDictionary 方法填充字典对象。但我无法模拟它,因为 GetDictionary 是扩展方法。

 private Mock<IDbConnection> _dbConnectionMock;
private Dictionary<string, string> _nameValuePairs;

[SetUp]
public void SetUp()
{
_dbConnectionMock = new Mock<IDbConnection>();

_nameValuePairs = new Dictionary<string, string>()
{
{"name","test"},
{"Updatedby", "5/23/12 7:00:15 AM"},
{"Address", "212 Adam St."}
};
}

在测试方法中
 var service = new CustomerLookupService(_dbConnectionMock.Object);
var response = (HttpResult)service.Any(new CustomerLookup { name = "test" });
//assert statements

如果不能模拟 GetDictionary 方法,我什至愿意调用命中 DB 的 web 方法,为此我需要创建 AppHost。

最佳答案

我认为有几个选项可供研究。

  • 模拟/ stub /单元测试扩展方法here , here或其他各种地点。我认为没有首选的方法可以做到这一点,但有一些选项和框架/库可以提供帮助。
  • 为单元测试运行内存数据库,例如 Sqlite。见 here .
  • 您可以将 IDConnection 抽象为 CustomerLookUpRepository 并将您的 CustomerLookUpRepository 注入(inject)您的服务。然后你可以模拟你的“存储库”。

  • 我已经尝试过这种“安排”。到目前为止,它似乎适用于大多数基本情况。数据访问模式取自 Redis Web Service example .不过,YMMV。

    测试 (使用 RhinoMocks)
        public void SomeTest()
    {
    var _nameValuePairs = new Dictionary<string, string>()
    {
    {"name","test"},
    {"Updatedby", "5/23/12 7:00:15 AM"},
    {"Address", "212 Adam St."}
    };

    var mockSqlRepository = MockRepository.GenerateMock<ISqlRepository>();
    mockSqlRepository.Stub(
    x => x.Exec(Arg<Func<IDbConnection, Dictionary<string, string>>>.Is.NotNull)).Return(_nameValuePairs);

    var service = new CustomerLookupService { SqlRepository = mockSqlRepository }
    //MORE TEST CODE...
    }

    服务类 - 使用 ISqlRepository 抽象/隐藏 IDbConnection。 ISqlRepository 有一个以函数为参数的函数。 (参数的)函数签名将 IDbConnection 作为参数,因此我不必编写几个方法来访问数据库。
    public class CustomerLookupService
    {
    public ISqlRepository SqlRepository { get; set; }

    public void Any(CustomerLookup request)
    {
    var results =
    SqlExec<Dictionary<string, string>>((con) => con.GetDictionary<type, type>("Select id, name from table"));
    //MORE SERVICE CODE
    }

    public T SqlExec<T>(Func<IDbConnection, T> fn)
    {
    return SqlRepository.Exec(fn);
    }
    }

    ISqlRepository
    public interface ISqlRepository
    {
    T Exec<T>(Func<IDbConnection, T> fn);
    }

    SqlRepository
    public class SqlRepository : ISqlRepository
    {
    public IDbConnectionFactory DbFactory { get; set; }

    public T Exec<T>(Func<IDbConnection, T> fn)
    {
    using (var con = DbFactory.OpenDbConnection())
    {
    return fn(con);
    }
    }
    }

    关于unit-testing - ServiceStack 服务的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15510292/

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