by Patrik Hägne via Legend and truth on 8/7/2009 12:15:00 PM
I added a new feature to FakeItEasy the other day, it lets you put a fake wrapper around a real instance. This means that all calls that are not explicitly configured to do anything different are delegated to the wrapped instance, this gives you the ability to fake out only a certain method on a fake.
For example, you might have a web service of some sort:
public interface IStoreService { IEnumerable<IProduct> FindAllProducts(); int BuyProduct(IProduct product); } public interface IProduct { string ProductId { get; } decimal Price { get; } }
Let’s say in an integration test of a class we are writing called PersonalShopper you want to run against an actual (let’s event say a sealed) implementation of this service, we can call it RidiculouslyOverPricedStore, but you want to fake out the BuyProduct-method so that nothing is actually booked in the remote system.
Here’s the PersonalShopper class we want to write an integration test for:
public class PersonalShopper { private IStoreService store; public PersonalShopper(IStoreService store) { this.store = store; } public IProduct BuyMeSomething() { var productToBy = (from product in this.store.FindAllProducts() orderby product.Price select product).First(); this.store.BuyProduct(productToBy); } }
Here’s a test for this where we create a fake wrapping an instance of the RidiculouslyOverPricedStore-class, we then configure calls to the BuyProduct-method with any product to return 1 (this is meant to be the order id).
[Test] public void Personal_shopper_buys_a_product() { // Arrange var realStore = new RidiculouslyOverPricedStore(); var fakedStore = A.Fake<IStoreService>(x => x.Wrapping(realStore)); A.CallTo(() => fakedStore.BuyProduct(A<IProduct>.Ignored.Argument)).Returns(1); var shopper = new PersonalShopper(fakedStore); // Act var boughtProduct = shopper.BuyMeSomething(); // Assert Assert.That(boughtProduct, Is.Not.Null); }
Another case to use this feature is if you have a class that you want to use in your test that you don’t have to configure at all, but you still want to assert that a certain method was called, just wrap an instance, use it as normal without configuring it and use Fake.Assert to assert on it.
Original Post: Fake wrappers (candy inside)
The content of the postings is owned by the respective author. CSharpFeeds is not responsible for the contents of the postings. This site is automatically generated and cannot be reviewed for abusive content. If you find abusive content on CSharpFeeds, please contact us. Designated trademarks and brands are the property of their respective owners. All rights reserved.