簡體   English   中英

起訂量:當 object 是模擬時,如何附加到 object 的委托屬性?

[英]Moq: How to attach to a delegate property of an object, when that object is a mock?

我有一個想要測試的 object,以及它的依賴項,我是 mocking。 依賴項有一個公共委托屬性,其功能本質上類似於event (我無法更改依賴項的代碼。)如何模擬依賴項,然后觸發其委托屬性?

我的情況:


/* The thing I am mocking */
public interface IUserLoginReporter {

    public delegate void UserLoggedIn(string userName);

    UserLoggedIn OnUserLoggedIn { get; set; }

}


/* The thing I am testing */
public class UserService {

   public UserService(IUserLoginReporter reporter) 
   {
       reporter.OnUserLoggedIn += RefreshLastSeenTime;
   } 
   
   public void RefreshLastSeenTime(string username)
   {
       ...
   }
}

如您所見,UserLoginReporter 有一個委托屬性,它將在用戶登錄時調用。UserService 將其 RefreshLastSeenTime 附加到此委托,因此我們采取一些措施作為響應。

這基本上是我寫的測試:

[Fact]
public void DelegateGetsInvoked()
{
    // Given
    var mockReporter = new Mock<IUserLoginReporter>();
    var userService = new UserService(mockReporter.Object);
    
    // When
    mockReporter.OnUserLoggedIn("abc");

    // Then
    // ... verify userService took correct actions ...
}

我在// When下方的行上收到了一個空引用異常。

理想情況下,如果接口與您的示例中描述的一樣簡單,那么您最好為您的測試創建一個簡單的實現。

但是,以下將允許調用委托並在被測主題內調用附加委托

//Arrange
var mock = new Mock<IUserLoginReporter>();
mock.SetupAllProperties(); //<--Automatically allow properties to be modifiable

UserService subject = new UserService(mock.Object);

string input = "I am working";

//Act
mock.Object.OnUserLoggedIn(input);

//Assert
mock.Verify(_ => _.OnUserLoggedIn);

//...assert expected behavior

沒有說明您要斷言的內容,因此是否可能還有待觀察。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM