Skip to content

Instantly share code, notes, and snippets.

@skoon
Created May 27, 2011 05:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save skoon/994671 to your computer and use it in GitHub Desktop.
Save skoon/994671 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
namespace MostlyScottish {
//This is what I think we should move towards
public interface IRepository<T> {
void Save(T entity);
}
public class StuffRepository : IRepository<Stuff> {
public void Save(Stuff entity) {
//save the Stuff
}
}
public class Stuff {
//poco DB entity class
}
public class StuffDoer {
private readonly IRepository<Stuff> _StuffRepo;
public StuffDoer(IRepository<Stuff> stuffRepo) {
_StuffRepo = stuffRepo;
}
public void MethodUnderTest() {
// blah blah blah, stuff we can't mock because they are all private instance methods
IEnumerable<Stuff> stuffCollection = new List<Stuff>();
foreach (var thing in stuffCollection) {
_StuffRepo.Save(thing);
//Now there is a direct link to the Save method on the StuffRepository.
}
}
}
}
using System;
using System.Collections.Generic;
namespace NotScottish {
//http://www.youtube.com/watch?v=KrQxQPG8JdE&feature=related
//So this is what we have now.
public interface IRepository<T> {
void Save(T entity);
}
public interface IStuffRepository : IRepository<Stuff> {
}
public abstract class BaseRepository<T> : IRepository<T> {
public void Save(T entity) {
//method that accepts string,Func<ISession,T>
}
}
public class StuffRepository : BaseRepository<Stuff>, IStuffRepository {
//Trying to use NSubstitute to mock the "Save" method, but where is it really at runtime?
}
public class Stuff {
//poco DB entity class
}
public class StuffDoer {
private readonly IStuffRepository _StuffRepo;
public StuffDoer(IStuffRepository stuffRepo) {
_StuffRepo = stuffRepo;
}
public void MethodUnderTest() {
// blah blah blah, stuff we can't mock because they are all private instance methods
IEnumerable<Stuff> stuffCollection = new List<Stuff>();
foreach (var thing in stuffCollection) {
_StuffRepo.Save(thing);
//Where is the Save method located at runtime and what can we really mock at this point?
//I think it's really located in BaseRepository BUT my magic mocker thinks that it is located on the instance of
//StuffRepository. So when it mocks "Save" on the StuffRepository, the mock method is located at one place on
//the heap, and the real Save method on the BaseRepository is located at another location on the heap. Both the
//StuffRepository and BaseRepository have their own MethodTables.
}
}
}
}
@paulbatum
Copy link

Oh in that case ignore my fork.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment