2010-09-10 85 views
1

這裏是代碼:爲什麼Rhino Mock期望不符合?

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

問題是什麼?什麼是錯誤?你期望什麼行爲? – Grzenio 2010-09-11 21:03:17

回答

1

任何改善,如果你使用這個測試?

[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的值如何,除非消費者檢查是否達到回程最大值,否則不會進行通知。

以這種方式混淆命令和查詢在語義上令人困惑。