c#培训的最低起订量不适用于套件中的首次测试

c#培训的最低起订量不适用于套件中的首次测试,c#,moq,C#,Moq,我对c#和Moq框架也不熟悉。我正在使用VS 2010 express和NUnit 在我的[设置]功能中,我有: this.mockAllianceController = new Mock<AllianceController>(); this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new List<string>()); .

我对c#和Moq框架也不熟悉。我正在使用VS 2010 express和NUnit

在我的[设置]功能中,我有:

    this.mockAllianceController = new Mock<AllianceController>();
    this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new List<string>());

    ...

    this.testObj = new DiplomacyLogic(this.mockAllianceController.Object);

aTest将在bTest通过时抛出NullReferenceException。有什么帮助吗?

如果您还显示
getAlliances
的声明以及这个.currentRealm是什么,那将很有帮助

但您可能想更改行:

this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new List<string>());
this.mockAllianceController.Setup(ac=>ac.getAlliances(this.currentRealm)).Returns(new List());
为此:

this.mockAllianceController.Setup(ac => ac.getAllies(It.IsAny<string>())).Returns(new List<string>());
this.mockAllianceController.Setup(ac=>ac.getAlliances(It.IsAny()).Returns(new List());

注意
It.IsAny()
作为
getAlliances()

的参数,如果
AllianceController
是一个类而不是一个接口,您可能需要执行以下操作:

this.mockAllianceController = new Mock<AllianceController>();
this.mockAllianceController.CallBase = True

this.mockAllianceController=new Mock)

我认为您的设置顺序错误,这会导致设置在第一次测试运行时无效,然后在第二次测试运行时,
this.testObj=new-外交官逻辑(this.mockAllianceController.Object)已创建,安装程序已初始化。这意味着您应该在设置之前初始化
emplicacLogic
,以获得所需的结果

我还包括了一个拆卸代码,这样您可以为每个测试获得新的对象,这是一个很好的实践,这样测试就不会相互依赖

请尝试下面的代码

[Setup]   
public void Setup()
{
    this.mockAllianceController = new Mock<AllianceController>();
    this.testObj = new DiplomacyLogic(this.mockAllianceController.Object);

    this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new         List<string>());
}

[TearDown]
public void TearDown()
{
    this.mockAllianceController = null;
    this.testObj = null;
}
[设置]
公共作废设置()
{
this.mockAllianceController=new Mock();
this.testObj=新的外交逻辑(this.mockAllianceController.Object);
this.mockAllianceController.Setup(ac=>ac.getAlliances(this.currentRealm)).Returns(new List());
}
[撕裂]
公共无效拆卸()
{
this.mockAllianceController=null;
this.testObj=null;
}

我还认为设置代码应该在testmethod中,而不是在setup中,这是因为您可能编写的其他测试可能不会在该方法中使用相同的设置。

发布第一个测试的代码。我是个傻瓜。我在安装后初始化了这个.currentRealm。所以真正的问题不是为什么第一次测试失败,而是为什么第二次测试通过了?我想如果没有[TearDown],这个.currentRealm没有被销毁?currentRealm只是一个字符串。当使用测试用例中指定的字符串以外的任何东西调用函数时,我希望该函数返回null。@Shane-Wimmel在正确的轨道上。在您的情况下,我将在设置中向getAlliances方法传递一个常量。这样,初始化currentRealm时就不重要了。是的,您可以在测试方法之间共享状态(坏)。在安装程序中重新初始化所有内容,在拆卸中重置所有字段/全局变量,或者在测试方法中仅使用局部变量(可能使用测试工厂方法创建)。请参阅示例
this.mockAllianceController = new Mock<AllianceController>();
this.mockAllianceController.CallBase = True
[Setup]   
public void Setup()
{
    this.mockAllianceController = new Mock<AllianceController>();
    this.testObj = new DiplomacyLogic(this.mockAllianceController.Object);

    this.mockAllianceController.Setup(ac => ac.getAllies(this.currentRealm)).Returns(new         List<string>());
}

[TearDown]
public void TearDown()
{
    this.mockAllianceController = null;
    this.testObj = null;
}