首页 > 解决方案 > mstest classinitialize 显示错误的签名错误信息

问题描述

我第一次使用 Mstest 并编写单元测试。我使用 ClassInitiaze 属性进行设置。自从我这样做以来,我一直在收到此消息

消息:方法 TryDI.Tests.HouseKeeperServiceTests.TestSetup 的签名错误。该方法必须是静态的、公共的、不返回值并且应该采用 TestContext 类型的单个参数。此外,如果您在方法中使用 async-await,则返回类型必须是 Task。

我在这里做错了什么?

        [TestClass]
        public class HouseKeeperServiceTests
        {
            private HousekeeperService _service;
            private Mock<IStatementGenerator> _statementGenerator;
            private Mock<IEmailSender> _emailSender;
            private Mock<IXtraMessageBox> _messageBox;
            private DateTime _statementDate = new DateTime(2017, 1, 1);
            private Housekeeper _houseKeeper;
      
            [ClassInitialize]
            public void TestSetup()
            {    
                _houseKeeper = new Housekeeper { Email = "a", FullName = "b", Oid = 1, StatementEmailBody = "c" };

                var unitOfWork = new Mock<IUnitOfWork>();
                unitOfWork.Setup(uow => uow.Query<Housekeeper>())
                    .Returns(new List<Housekeeper>
                    {
                       _houseKeeper

                    }.AsQueryable());

                _statementGenerator = new Mock<IStatementGenerator>();
                _emailSender = new Mock<IEmailSender>();
                _messageBox = new Mock<IXtraMessageBox>();

                var service = new HousekeeperService(unitOfWork.Object,
                                                     _statementGenerator.Object,
                                                     _emailSender.Object,
                                                     _messageBox.Object);
            }

            [TestMethod]
            public void SendStatementEmails_WhenCalled_GenerateStatements()
            {
                _service.SendStatementEmails(_statementDate);

                _statementGenerator.Verify(sg =>
                   sg.SaveStatement(_houseKeeper.Oid, _houseKeeper.FullName, (_statementDate)));
            }
        }
        
        

标签: c#mstest

解决方案


您可以使用 TestInitialize:

    [TestInitialize]
    public static void TestSetup() { }

但如果你想使用 ClassInitialize 看到这篇文章:

错误 CLassInitialize 签名错误。方法必须是静态的,公开的,不返回值

“ClassInitialize 属性需要添加括号,其次尝试使方法名称与属性不同,因为它可能会使编译器感到困惑”

例如:

[ClassInitialize()]
public static void TestSetup(TestContext context){  }

无论如何,您应该知道 TestInitializer 和 ClassInitializer 之间的区别:

TestInitialize在声明属性的同一类上声明的每个测试之前运行。”

ClassInitialize仅在声明属性的类的初始化时运行。换句话说,它不会为每个类运行。仅适用于包含 ClassInitialize 方法的类。”

更多信息:https ://stackoverflow.com/questions/22999816/testinitialize-vs-classinitialize#:~:text=TestInitialize%20runs%20before%20every%20test,where%20the%20attribute%20is%20declared.&text=If %20you%20want%20a%20方法,类的%20initialization%20use%20the%20AssemblyInitialize%20


推荐阅读