代码之家  ›  专栏  ›  技术社区  ›  Xaisoft

为什么没有达到犀牛嘲笑的预期?

  •  1
  • Xaisoft  · 技术社区  · 14 年前

    下面是代码:

    public interface IAccessPoint
    {
        int BackHaulMaximum { get; set; }
    
        bool BackHaulMaximumReached();
        void EmailNetworkProvider();
    }
    
    public class AccessPoint : IAccessPoint
    {
        private IMailProvider Mailer { get; set; }
    
        public AccessPoint(IMailProvider provider)
        {
            this.Mailer = provider ?? new DefaultMailProvider();
        }
    
        public int BackHaulMaximum { get; set; }
    
        public bool BackHaulMaximumReached()
        {
            if (BackHaulMaximum > 80)
            {
                EmailNetworkProvider();
                return true;
            }
            return false;
        }
    
    
        public void EmailNetworkProvider()
        {
            this.Mailer.SendMail();
        }
    }
    
    public interface IMailProvider
    {
        void SendMail();
    }
    
    public class DefaultMailProvider : IMailProvider
    {
        public void SendMail()
        {
    
        }
    }
    
    // Here is the Test, It is not calling EmailNetworkProvider which calls SendMail()
    
    [TestFixture]
    public class Tests
    {
        [Test]
        public void NetworkProviderShouldBeEmailedWhenBackHaulMaximumIsReached()
        {
            var mailerMock = MockRepository.GenerateMock<IMailProvider>();
    
            mailerMock.Expect(x => x.SendMail());
    
            var accessPoint = new AccessPoint(mailerMock);
    
            accessPoint.BackHaulMaximum = 81;
    
            Assert.IsTrue(accessPoint.BackHaulMaximumReached());
    
            mailerMock.VerifyAllExpectations();
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Jay    14 年前

    如果你使用这个测试有什么改进吗?

    [Test]
    public void NetworkProviderShouldBeEmailedWhenBackHaulMaximumIsReached()
    {
        var mailerMock = MockRepository.GenerateStub<IMailProvider>();
        var accessPoint = new AccessPoint(mailerMock);
    
        accessPoint.BackHaulMaximum = 81;
    
        var actual = accessPoint.BackHaulMaximumReached();
    
        Assert.AreEqual(true, actual);
        mailerMock.AssertWasCalled(x => x.SendMail());
    }
    

    作为旁注, BackhaulMaximumReached() 是一种奇怪的设计。除非消费者检查是否达到了后运距最大值,否则不会发出通知,无论 BackHaulMaximum .

    以这种方式组合命令和查询在语义上是混淆的。