C# 最小起订量覆盖以前的设置?

C# 最小起订量覆盖以前的设置?,c#,parameters,nunit,overriding,moq,C#,Parameters,Nunit,Overriding,Moq,嗨,我想用两个可能的输入设置一个类方法的模拟。当我检查输出时,只有最后设置返回预期输出。第一个没有。非常感谢您的帮助 [Test] public void ClimbOnceTwoNeighbour_Sample() { stateConverter = new Mock<StateConverter>(); solution = new Mock<Solution>(); state = new Mock<State>();

嗨,我想用两个可能的输入设置一个类方法的模拟。当我检查输出时,只有最后设置返回预期输出。第一个没有。非常感谢您的帮助

[Test]
public void ClimbOnceTwoNeighbour_Sample()
{
    stateConverter = new Mock<StateConverter>();

    solution = new Mock<Solution>();
    state = new Mock<State>();

    var neightbourSolution1 = new Mock<Solution>();
    var neighbourState1 = new Mock<State>();
    var neightbourSolution2 = new Mock<Solution>();
    var neighbourState2 = new Mock<State>();

    stateConverter.Setup(x => x.FromSolution(neightbourSolution1.Object, It.IsAny<State>())).Returns(neighbourState1.Object);
    stateConverter.Setup(x => x.FromSolution(neightbourSolution2.Object, It.IsAny<State>())).Returns(neighbourState2.Object);

    var state1 = stateConverter.Object.FromSolution(neightbourSolution1.Object, state.Object);//return null ????
    var state2 = stateConverter.Object.FromSolution(neightbourSolution2.Object, state.Object);//return neighbourState2.Object)


    Assert.AreEqual(neighbourState2.Object, state2);//pass test here
    Assert.AreEqual(neighbourState1.Object, state1);//fail here due to null is returned from previous statement

}
[测试]
公共空间爬升网络本_示例()
{
stateConverter=newmock();
解决方案=新模拟();
state=newmock();
var neightbourSolution1=new Mock();
var neighbourState1=新模拟();
var neightbourSolution2=新模拟();
var neighbourState2=新模拟();
stateConverter.Setup(x=>x.FromSolution(neightbourSolution1.Object,It.IsAny())。返回(neighturstate1.Object);
stateConverter.Setup(x=>x.FromSolution(neightbourSolution2.Object,It.IsAny())。返回(neighturstate2.Object);
var state1=stateConverter.Object.FromSolution(neightbourSolution1.Object,state.Object);//返回null????
var state2=stateConverter.Object.FromSolution(neightbourSolution2.Object,state.Object);//返回邻居state2.Object)
Assert.AreEqual(neighbourState2.Object,state2);//在这里通过测试
Assert.AreEqual(neighbourState1.Object,state1);//此处失败,因为上一条语句返回null
}

我复制了您的代码片段并创建了空类以使其可编译。它按预期工作。请试一试,让我知道结果是什么

代码如下:

using Moq;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        var stateConverter = new Mock<StateConverter>();

        var solution = new Mock<Solution>();
        var state = new Mock<State>();

        var neightbourSolution1 = new Mock<Solution>();
        var neighbourState1 = new Mock<State>();
        var neightbourSolution2 = new Mock<Solution>();
        var neighbourState2 = new Mock<State>();

        stateConverter.Setup(x => x.FromSolution(neightbourSolution1.Object, It.IsAny<State>())).Returns(neighbourState1.Object);
        stateConverter.Setup(x => x.FromSolution(neightbourSolution2.Object, It.IsAny<State>())).Returns(neighbourState2.Object);

        var state1 = stateConverter.Object.FromSolution(neightbourSolution1.Object, state.Object);
        var state2 = stateConverter.Object.FromSolution(neightbourSolution2.Object, state.Object);
    }
}

public class State{}

public class Solution{}

public abstract class StateConverter
{
    public abstract State FromSolution(Solution p0, State isAny);
}
使用Moq;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
var stateConverter=new Mock();
var solution=newmock();
var state=newmock();
var neightbourSolution1=new Mock();
var neighbourState1=新模拟();
var neightbourSolution2=新模拟();
var neighbourState2=新模拟();
stateConverter.Setup(x=>x.FromSolution(neightbourSolution1.Object,It.IsAny())。返回(neighturstate1.Object);
stateConverter.Setup(x=>x.FromSolution(neightbourSolution2.Object,It.IsAny())。返回(neighturstate2.Object);
var state1=stateConverter.Object.FromSolution(neightbourSolution1.Object,state.Object);
var state2=stateConverter.Object.FromSolution(neightbourSolution2.Object,state.Object);
}
}
公共类状态{}
公共类解决方案{}
公共抽象类状态转换器
{
解决方案的公共抽象状态(解决方案p0,状态为any);
}

}我在Moq中养成的习惯之一是使用完整的It.is(o=>o==object)语法,以避免在设置可能模棱两可或含蓄时出现任何问题。可能是Moq只是在设置中获取对象,并覆盖它已经存在的任何其他对象

stateConverter.Setup(x => x.FromSolution(neightbourSolution1.Object, It.IsAny<State>())).Returns(neighbourState1.Object);
stateConverter.Setup(x => x.FromSolution(neightbourSolution2.Object, It.IsAny<State>())).Returns(neighbourState2.Object);
statecoverter.Setup(x=>x.FromSolution(neightbourSolution1.Object,It.IsAny())。返回(neighturstate1.Object);
stateConverter.Setup(x=>x.FromSolution(neightbourSolution2.Object,It.IsAny())。返回(neighturstate2.Object);
然后看起来像

stateConverter.Setup(x => x.FromSolution(It.Is<Solution>(solution => solution == neightbourSolution1.Object), It.IsAny<State>())).Returns(neighbourState1.Object);
stateConverter.Setup(x => x.FromSolution(It.Is<Solution>(solution => solution == neightbourSolution2.Object), It.IsAny<State>())).Returns(neighbourState2.Object);
statecoverter.Setup(x=>x.FromSolution(It.Is(solution=>solution==neightbourSolution1.Object),It.IsAny())。返回(neighturstate1.Object);
stateConverter.Setup(x=>x.FromSolution(It.Is(solution=>solution==neightbourSolution2.Object),It.IsAny()).Returns(neighturstate2.Object);

我不太确定这是否能解决你的问题,因为它的含蓄性非常明显/

你试过这样的东西吗

[Test]
public void ClimbOnceTwoNeighbour_Sample()
{
    stateConverter = new Mock<StateConverter>();

    solution = new Mock<Solution>();
    state = new Mock<State>();

    var neightbourSolution1 = new Mock<Solution>();
    var neighbourState1 = new Mock<State>();
    var neightbourSolution2 = new Mock<Solution>();
    var neighbourState2 = new Mock<State>();

    stateConverter.Setup(x => x.FromSolution(neightbourSolution1.Object, It.IsAny<State>())).Returns(neighbourState1.Object);
    var state1 = stateConverter.Object.FromSolution(neightbourSolution1.Object, state.Object);//return null ????


    stateConverter.Setup(x => x.FromSolution(neightbourSolution2.Object, It.IsAny<State>())).Returns(neighbourState2.Object);
    var state2 = stateConverter.Object.FromSolution(neightbourSolution2.Object, state.Object);//return neighbourState2.Object)


    Assert.AreEqual(neighbourState2.Object, state2);//pass test here
    Assert.AreEqual(neighbourState1.Object, state1);//fail here due to null is returned from previous statement

}
[测试]
公共空间爬升网络本_示例()
{
stateConverter=newmock();
解决方案=新模拟();
state=newmock();
var neightbourSolution1=new Mock();
var neighbourState1=新模拟();
var neightbourSolution2=新模拟();
var neighbourState2=新模拟();
stateConverter.Setup(x=>x.FromSolution(neightbourSolution1.Object,It.IsAny())。返回(neighturstate1.Object);
var state1=stateConverter.Object.FromSolution(neightbourSolution1.Object,state.Object);//返回null????
stateConverter.Setup(x=>x.FromSolution(neightbourSolution2.Object,It.IsAny())。返回(neighturstate2.Object);
var state2=stateConverter.Object.FromSolution(neightbourSolution2.Object,state.Object);//返回邻居state2.Object)
Assert.AreEqual(neighbourState2.Object,state2);//在这里通过测试
Assert.AreEqual(neighbourState1.Object,state1);//此处失败,因为上一条语句返回null
}

我认为这样,当您将第一次返回的结果分配给state1时,可以再次使用Setup并将结果添加到state2;)

我建议您将此测试分为两个不同的测试,每种类型的输入一个。简单是单元测试的关键。非常感谢您的评论。这不是我想测试的主要部分,但是此代码片段会影响测试结果:-(我发现了原因问题,但我仍然不确定如何解决它。如果解决方案类有自定义平等实现,Moq不起作用。请对此有任何想法?您好,非常感谢您的帮助。我使用了您的建议,效果很好。然后我有实现平等成员,然后它的原因问题如上所述。有没有解决方法轻松?我也有模拟相等吗?公共类解决方案{private String[]\u strings;protected bool Equals(解决方案其他){return Equals(_strings,other.\u strings);}public override bool Equals(object obj){if(ReferenceEquals(null,obj))返回false;if(ReferenceEquals(this,obj))返回true;if(obj.GetType()!=this.GetType())返回false;返回Equals((解决方案)obj);}public override int GetHashCode(){return(_strings!=null?_strings.GetHashCode():0);}抱歉的评论不允许太长的文本:-(非常感谢您的帮助。我尝试过,但不起作用。我已找到原因,但仍不确定如何克服此问题。如果我的解决方案实现了客户平等,则会发生这种情况