Xác minh Moq với tham số đối tượng


86

Tôi đang cố gắng xác minh một tham số là một lớp. Mã đang được kiểm tra là tốt. Lỗi là trong thử nghiệm.

Tôi đã thử hai phương pháp, cả hai đều không thành công.

Đây là những nỗ lực của tôi:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions()
    {
        Width = 256,
        Height = 256,
    }));

Điều này luôn không thành công, mặc dù một đối tượng được truyền dưới dạng tham số thứ hai có các thuộc tính bằng nhau. Tham số đầu tiên được xác minh là tốt.

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>()))
    .Callback<byte[], ImageFilterOptions>((data, options) =>
        {
            Assert.AreEqual(this.UploadedFileData, data, "data");
            Assert.AreEqual(filterOptions.Width, options.Width, "Width");
            Assert.AreEqual(filterOptions.Height, options.Height, "Height");
        }
    );

Điều này luôn trôi qua, ngay cả khi nó sẽ thất bại. Asserts trong callback không thành công, nhưng ngoại lệ không được chuyển đến ngữ cảnh bên ngoài và do đó kiểm tra luôn vượt qua.

Bạn có thể giúp tôi tìm ra những gì tôi đang làm sai?

Câu trả lời:


138

Nỗ lực đầu tiên gần hơn với những gì bạn muốn đạt được.

Lý do nó không thành công là Moq (có thể) sử dụng Object.Equalsbên dưới để kiểm tra xem ImageFilterOptionstham số mà phương thức được gọi có giống với tham số mà bạn đã cung cấp trong lệnh gọi hay không Verify.

Không thể để chúng giống nhau, bởi vì trong Verifybạn tạo ra một new ImageFilterOptions().

Thay vì thực hiện kiểm tra tham số theo cách này, bạn có thể sử dụng It.Iscú pháp của Moq để cung cấp một biểu thức xác minh tham số là tham số mong đợi.

Trong trường hợp của bạn, bạn muốn kiểm tra xem các tham số là kiểu ImageFilterOptionsvà rằng cả WidthHeightđược thiết lập để 256. Biểu thức cho phép bạn làm điều đó là:

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)

Vì vậy, cuộc gọi của bạn đến Verifycó thể trông giống như sau:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));

1
Cú pháp mà tôi đã phải sử dụng sẽ là: It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). Không có genericIs
Stanislav

1
Phiên bản chung phù hợp với tôi và có trong tài liệu API nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - bạn có đang sử dụng phiên bản Moq lỗi thời không?
Tim Abell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.