C# - MS测试 - 创建一个先运行另一个测试的测试

时间:2016-03-13 23:15:17

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

你现在遇到问题的原因,可能是因为你至少打破了单一的责任原则(说明你的班级应该只有一个理由要改变)。我可以假设这是因为您声明类中的OTHER方法依赖于登录成功。以下是解决方法:

为您的登录方法创建一个界面,例如:

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() );
}

答案 1 :(得分:2)

基类怎么样?

[TestClass]
public class AuthenticatedTest
{
  [TestInitialize]
  public void TestInitialize()
  {
    // login
  }
}

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

您不应该编写依赖其他测试的测试。如果您之前需要登录,则必须先记录n,而不是&#34;运行登录测试&#34;。它可能与代码差别不大,但概念不同。