C# 如何使用RhinoAutoMocker注入基本值?

C# 如何使用RhinoAutoMocker注入基本值?,c#,dependency-injection,structuremap,rhino-mocks,C#,Dependency Injection,Structuremap,Rhino Mocks,我一直在使用RhinoAutoMocker进行单元测试,它在几乎所有情况下都工作得很好。我现在很难弄清楚当被测试的类有原始构造函数参数时如何使用它 假设我有两个这样定义的类: public class AddAnswerValidator : BaseValidator { public AddAnswerValidator(Answer answerToAdd, IAnswerRepository answerReposit

我一直在使用RhinoAutoMocker进行单元测试,它在几乎所有情况下都工作得很好。我现在很难弄清楚当被测试的类有原始构造函数参数时如何使用它

假设我有两个这样定义的类:

public class AddAnswerValidator : BaseValidator
{
    public AddAnswerValidator(Answer answerToAdd, 
                              IAnswerRepository answerRepository)
    {
        ...some code
    }

    public override bool Validates()
    {
        ...some code
    }
}

public class RemoveAnswerValidator : BaseValidator
{
    public RemoveAnswerValidator(int answerIDToRemove, 
                                 IAnswerRepository answerRepository)
    {
        ...some code
    }

    public override bool Validates()
    {
        ...some code
    }
}
每个测试的示例如下所示:

[Test]
public void AddAnswerValidatorTests_Validates_ValidInput_ReturnsTrue()
{
    var autoMocker = new RhinoAutoMocker<AddAnswerValidator>();
    var fakeAnswer = new Answer();
    autoMocker.Inject<Answer>(fakeAnswer);

    var result = autoMocker.ClassUnderTest.Validates();

    Assert.IsTrue(result);
}

[Test]
public void RemoveAnswerValidatorTests_Validates_ValidInput_ReturnsTrue()
{
    var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>();
    var fakeAnswerID = 1;
    autoMocker.Inject<int>(fakeAnswerID);

    var result = autoMocker.ClassUnderTest.Validates();

    Assert.IsTrue(result);
}
[测试]
public void AddAnswerValidatorTests_Validates_ValidInput_ReturnsTrue()
{
var autoMocker=new RhinoAutoMocker,我一直在跟踪,但我不明白为什么没有注入原语值

我甚至尝试替换容器对象上可用的一些重载注入方法,例如:

autoMocker.Inject<int>(fakeAnswerID);
autoMocker.Inject(fakeAnswerID);

autoMocker.Container.Inject(“answerIDToRemove”,fakeAnswerID);
但是使用构造函数参数的名称不会产生任何不同的结果

--


从长远来看,这不是一个大问题,因为我总是可以创建被测类的实例并创建自己的mock,如果能够在所有测试中使用一致的方法就好了。

虽然我从未找到使用AutoMocker注入原语的方法,但我最终还是通过creati解决了这个问题取消参数对象并将其注入

除其他(以前的)参数外,parameter对象还包括作为属性的必要原语。上述示例将更改为:

public class RemoveAnswerValidator : BaseValidator
{
    public RemoveAnswerValidator(RemoveAnswerValidatorParameters parms)
    {
        ...some code
    }

    public override bool Validates()
    {
        ...some code
    }
}

public class RemoveAnswerValidatorParameters
{
    public int AnswerID { get; set; }
    public IAnswerRepository AnswerRepository { get; set; }
}
(然后在测试课上)

[测试]
public void RemoveAnswerValidatorTests_Validates_ValidInput_ReturnsTrue()
{
var autoMocker=new RhinoAutoMocker();
var fakeAnswerParameters=新的fakeAnswerParameters()
{
AnswerID=1,
AnswerRepository=autoMocker.Get()
};
自动模拟。注入(假应答);
var result=autoMocker.ClassUnderTest.Validates();
断言(结果);
}

我知道,这有点太晚了,但我遇到了同样的问题,并设法用integer参数解决了它:

var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>();
automocker.Container.Configure(c=>
         c.For<RemoveAnswerValidator>()
           .Use<RemoveAnswerValidator>()
                .Ctor<int>()
                .Is(1));
var autoMocker=new RhinoAutoMocker();
automocker.Container.Configure(c=>
c、 For()
.Use()
.Ctor()
.Is(1));
[Test]
public void RemoveAnswerValidatorTests_Validates_ValidInput_ReturnsTrue()
{
    var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>();
    var fakeAnswerParameters = new FakeAnswerParameters()
    {
        AnswerID = 1,
        AnswerRepository = autoMocker.Get<IAnswerRepository>()
    };
    autoMocker.Inject<RemoveAnswerValidatorParameters>(fakeAnswer);

    var result = autoMocker.ClassUnderTest.Validates();

    Assert.IsTrue(result);
}
var autoMocker = new RhinoAutoMocker<RemoveAnswerValidator>();
automocker.Container.Configure(c=>
         c.For<RemoveAnswerValidator>()
           .Use<RemoveAnswerValidator>()
                .Ctor<int>()
                .Is(1));