【问题标题】:C# - MS Test - Create a test that runs another test firstC# - MS Test - 创建一个首先运行另一个测试的测试
【发布时间】:2016-03-13 23:15:16
【问题描述】:

在我们的应用程序中,我为我们的网站创建了一个登录测试。如果此测试成功,则登录成功。现在要为网站的其他部分创建测试,我需要先执行登录。

有没有办法让我将创建的所有其他测试首先运行登录测试?例如:是否可以创建一个自定义登录测试属性,我可以将它放在所有其他测试方法上,以便它们首先运行登录?但是我还需要那个登录测试的返回值!

如果没有,那么我将只需要编写一个执行登录操作的普通 C# 函数,并且我需要将该函数调用作为每个测试的第一行。

【问题讨论】:

  • 只需将您的登录逻辑放在一个方法中,并使用TestInitialize 属性在其他测试之前自动运行它。 msdn.microsoft.com/en-us/library/ms182517(v=vs.100).aspx
  • 但它返回了一些我需要在所有其他测试中使用的对象。我将如何获得它?
  • 测试不应该返回任何东西,也不应该相互依赖,只需将整个逻辑放在一个方法中,然后在两个测试中调用该方法。

标签: c# .net unit-testing integration-testing mstest


【解决方案1】:

当您编写单元测试时,您是在隔离中测试每个方法。意思是,您正在测试的方法不能也不能依赖于其他任何东西才能运行。

你现在遇到问题的原因,可能是因为你至少违反了单一责任原则(即你的班级应该只有一个改变的理由)。我可以假设这是因为您说您在类中的其他方法取决于登录是否成功。解决方法如下:

为您的登录方法创建一个接口,例如:

public interface ILoginManager{
   void Authenticate(string username, string password);

   void IsAuthenticated{ get;}
}

接下来,使用依赖倒置原则,将此接口与方法一起添加到您的类中:

public class MyWorkerClass
{
  private readonly ILoginManager _loginManager;
  public MyWorkerClass(ILoginManager loginManager){
    _loginManager = loginManager;
  }


  public bool LogOnUser(string userName, string password){
    _loginManager.Authenticate(userName, password);

    return _loginManager.IsAuthenticated;
  }
}

现在,在您的所有测试中,您可以模拟 LoginManager,并在那里设置您的期望,即

[TestMethod]
public void SomeMethod_UserIsAuthenticated_InvokesSomeOtherMethod()
{
  // Arrange
  GetMockFor<ILoginManager>().SetupGet(lm => lm.Authenticated).Returns(true);

  // Act
  var result = Instance.SomeMethod();

  // Assert
  GetMockFor<ISomeOtherInterface>()
    .Verify(o => o.SomeOtherMethod(), Times.AtLeastOnce() );
}

【讨论】:

    【解决方案2】:

    基类呢?

    [TestClass]
    public class AuthenticatedTest
    {
      [TestInitialize]
      public void TestInitialize()
      {
        // login
      }
    }
    
    [TestClass]
    public class MyTests : AuthenticatedTest
    {
      [TestMethod]
      public void Whatever()
      {
        // already logged in.
      }
    }
    

    您不应该编写依赖于其他测试的测试。如果需要先登录,必须先登录n,而不是“运行登录测试”。大概不是代码的区别,而是概念的区别。

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      相关资源
      最近更新 更多