Showing posts with label moq. Show all posts
Showing posts with label moq. Show all posts

Wednesday, 18 April 2012

MOQ Samples

MOQ like RhinoMocks uses Castle Dynamic Proxy under the covers to generate “objects” from classes or interfaces.

Here is a quick look at the MOQ Store sample contained within the source: http://code.google.com/p/moq/

Stories

image

Class Diagram

image

Tests

ShouldSetViewCategories

[Test]
public void ShouldSetViewCategories()
{
// Arrange
var catalog = new Mock<ICatalogService>();
var view = new Mock<IProductsView>();

// Act
var presenter = new ProductsPresenter(catalog.Object, view.Object);

// Assert
view.Verify(v => v.SetCategories(It.IsAny<IEnumerable<Category>>()));
}

Shows how Moq generates a real object from an interface, stored in the mock object property
“Verify” extension method from Moq verifies that the expression was called on the mock object
It.IsAny<T>() is generating a default dummy value for the SetCategories, just to check it can be called


ShouldCategorySelectionSetProducts

[Test]
public void ShouldCategorySelectionSetProducts()
{
// Arrange
var catalog = new Mock<ICatalogService>();
var view = new Mock<IProductsView>();
var presenter = new ProductsPresenter(catalog.Object, view.Object);

// Act
view.Raise(
v => v.CategorySelected += null,
new CategoryEventArgs(new Category { Id = 1 }));

// Assert
view.Verify(v => v.SetProducts(It.IsAny<IEnumerable<Product>>()));
}

Shows an event being raised on a mocked object


ShouldPlaceOrderIfEnoughInventory

[Test]
public void ShouldPlaceOrderIfEnoughInventory()
{
// Arrange
var catalog = new Mock<ICatalogService>();
var view = new Mock<IProductsView>();
var presenter = new ProductsPresenter(catalog.Object, view.Object);
var order = new Order
{
Product = new Product { Id = 1 },
Quantity = 5
};

catalog
.Setup(c => c.HasInventory(1, 5))
.Returns(true);

// Act
presenter.PlaceOrder(order);

// Assert
Assert.IsTrue(order.Filled);
catalog.Verify(c => c.HasInventory(1, 5));
}

“Setups” the result of True for the mock object if method HasInventory(1, 5) is called.
NOTE:  presenter.PlaceOrder(order) internally calls HasInventory(1, 5) to set the order.Filled property


ShouldNotPlaceOrderIfNotEnoughInventory

[Test]
public void ShouldNotPlaceOrderIfNotEnoughInventory()
{
// Arrange
var catalog = new Mock<ICatalogService>();
var view = new Mock<IProductsView>();
var presenter = new ProductsPresenter(catalog.Object, view.Object);
var order = new Order
{
Product = new Product { Id = 1 },
Quantity = 5
};

catalog
.Setup(c => c.HasInventory(1, 5))
.Returns(false);

// Act
presenter.PlaceOrder(order);

// Assert
Assert.IsFalse(order.Filled);
catalog.Verify(c => c.HasInventory(1, 5));
}

As per the previous test notes.


ShouldNotPlaceOrderIfFailsToRemove

[Test]
public void ShouldNotPlaceOrderIfFailsToRemove()
{
// Arrange
var catalog = new Mock<ICatalogService>();
var view = new Mock<IProductsView>();
var presenter = new ProductsPresenter(catalog.Object, view.Object);
var order = new Order
{
Product = new Product { Id = 1 },
Quantity = 5
};

catalog
.Setup(c => c.HasInventory(1, 5))
.Returns(true);
catalog
.Setup(c => c.Remove(1, 5))
.Throws<InvalidOperationException>();

// Act
presenter.PlaceOrder(order);

// Assert
Assert.IsFalse(order.Filled);
catalog.Verify(c => c.HasInventory(1, 5));
catalog.Verify(c => c.Remove(1, 5));
}

Source Code


http://stevenhollidge.com/blog-source-code/Moq-StoreSample.zip