2014-06-25 14 views
9

Tôi có một bài kiểm tra đơn vị tôi đang kiểm tra xem một phương pháp được gọi là một lần hay không vì vậy tôi cố gắng theo cách này: -Xác nhận một phương pháp được gọi là hay không trong Unit Test

Đây là Mock của tôi về ILicenseManagerService và tôi đang đi qua đối tượng của nó thông qua construstor.

public Mock<ILicenseManagerService> LicenseManagerService { get { return SetLicenseManagerServiceMock(); } } 

    private Mock<ILicenseManagerService> SetLicenseManagerServiceMock() 
    { 
     var licencemangerservicemock = new Mock<ILicenseManagerService>(); 
     licencemangerservicemock.Setup(m => m.LoadProductLicenses()).Returns(ListOfProductLicense).Verifiable(); 

     return licencemangerservicemock; 
    } 

    public static async Task<IEnumerable<IProductLicense>> ListOfProductLicense() 
    { 
     var datetimeoffset = new DateTimeOffset(DateTime.Now); 

     var lst = new List<IProductLicense> 
     { 
      GetProductLicense(true, datetimeoffset, false, "1"), 
      GetProductLicense(true, datetimeoffset, false, "2"), 
      GetProductLicense(true, datetimeoffset, true, "3") 
     }; 

     return lst; 
    } 

Tôi đang sử dụng đối tượng giả này để đặt _licenseManagerService và gọi phương thức LoadProductLicenses() trong thử nghiệm. như thế này. giấy phép đang hoạt động tốt.

var licenses = (await _licenseManagerService.LoadProductLicenses()).ToList(); 

nỗ lực của tôi cho kiểm tra cuộc gọi đến phương pháp này -

LicenseManagerService.Verify(m => m.LoadProductLicenses(),Times.Once); 

Nhưng khi tôi runing kiểm tra đơn vị của tôi một ngoại lệ sắp tới mà nói phương pháp không được invocked ở tất cả. nơi tôi đang làm sai?

EDIT @dacastro Tôi gọi cùng một mô hình ở đây là thử nghiệm đơn vị của tôi.

[TestMethod] 
    [TestCategory("InApp-InAppStore")] 
    public async Task return_products_from_web_when_cache_is_empty() 
    { 
     // this class basically for setting up external dependencies 
     // Like - LicenceManagerService in context, i am using this mock only no new mock. 
     var inAppMock = new InAppMock();     


     // object of Class under test- I used static method for passing external   
     //services for easy to change 
     var inAppStore = StaticMethods.GetInAppStore(inAppMock); 

     // method is called in this method 
     var result = await inAppStore.LoadProductsFromCacheOrWeb(); 

     // like you can see using the same inAppMock object and same LicenseManagerService 
     inAppMock.LicenseManagerService.Verify(m => m.LoadProductLicenses(),Times.Once); 


    } 

Trả lời

11
LicenseManagerService.Verify(m => m.LoadProductLicenses(),Times.Once); 

Bằng cách gọi LicenseManagerService bất động sản, bạn đang tạo một mới đối tượng giả. Đương nhiên, không có invocations nào từng được thực hiện trong trường hợp này.

Bạn nên thay đổi cách triển khai của thuộc tính này để trả về cùng một phiên bản mỗi khi được gọi.

+0

tôi chắc chắn rằng tôi đang sử dụng cùng một đối tượng giả. bạn có thể xem bản chỉnh sửa không. – loop

+0

@loop bạn có thể đăng định nghĩa cho 'InAppMock.LicenseManagerService' không? – dcastro

+0

Nó nằm ở vị trí cao nhất. thực sự LiceneseManagerService là một trong những thuộc tính của lớp InAppMock. Về cơ bản, lớp InAppMock cung cấp Mock các phụ thuộc bên ngoài. Tôi đã thực hiện để sử dụng nó trong nhiều trường hợp thử nghiệm. – loop

Các vấn đề liên quan