将具有泛型的接口注入Nancy Bootstrapper
本文关键字:注入 Nancy Bootstrapper 接口 泛型 | 更新日期: 2023-09-27 18:12:07
我在测试中遇到了一些奇怪的行为。下面是测试代码:
protected IAuditingService<BillingAudit> FakeBiometricsService;
protected Browser Browser;
[TestInitialize]
public void Initialize()
{
FakeBiometricsService = A.Fake<IAuditingService<BillingAudit>>();
A.CallTo(() => FakeBiometricsService.UpdateAudit(A<BiometricAudit[]>.Ignored)).DoesNothing();
Browser = new Browser(c => c.Module<Biometrics>().Dependency(FakeBiometricsService));
}
[TestMethod]
public void calling_endpoint_with_correct_data__calls_biometrics_service_to_save_data()
{
var response = Browser.Post("/Audits/Biometrics", with =>
{
with.HttpRequest();
with.Header("accept", "application/xml");
with.Body(JsonConvert.SerializeObject(new
{
data = new[]
{
new
{
SomeProperty = SomeValue
}
}
}));
});
response.StatusCode.Should().Be(HttpStatusCode.OK);
A.CallTo(() => FakeBiometricsService.UpdateAudit(A<BiometricAudit[]>.Ignored)).MustHaveHappened();
这里我要做的就是满足A.Fake<IAuditingService<BillingAudit>>()
这是我的模块看起来像什么。每个模块都继承这个基类:
public abstract class AuditModuleBase<TModel, TService> : NancyModule where TModel : BillingAudit, new() where TService : IAuditingService<TModel>, new()
{
private readonly IAuditingService<TModel> _auditingService;
protected AuditModuleBase(string endpoint, TService auditingService)
: base("/Audits/" + endpoint)
{
_auditingService = auditingService;
Post["/"] = x =>
{
var data = Request.Body.FromJson<JObject>();
return SaveLocationUpdates(data["data"].Children().Select(y => (TModel)new TModel().Parse(y)).ToArray());
};
}
private Response SaveLocationUpdates(TModel[] update)
{
_auditingService.UpdateAudit(update);
return new Response();
}
}
那么,我的生物识别模块看起来像这样:
public class Biometrics : AuditModuleBase<BiometricAudit, BiometricsAuditingService>
{
public Biometrics(BiometricsAuditingService service) : base("Biometrics", service) { }
}
对代码转储表示抱歉。其思想是,每个模块都扩展了一个基类,该基类期望有一个BillingAudit类型的T和一个IAuditingService。然而,当我在Browser对象中传递这个false到依赖满足器时,Nancy查找IAuditingService>的实际实现并传递进去,这不是期望的行为!是否有一个问题,满足依赖与FakeItEasy假?或者带有泛型的接口?还是我忽略了一些很明显的东西?
哦,我还想提一下BiometricAudit扩展了BillingAudit。它是一个带有抽象类泛型的接口。我试过伪造一个IAuditingService和一个IAuditingService,但似乎都不能满足Nancy。啊,没有我想象的那么刺激。对不起!我只是在犯傻。
我试图满足BiometricsAuditingService类型的依赖,这是IAuditingService的具体实现。一旦我把它变成了一个接口,所有的东西都正确地注入了。