I haven't read it yet but, thanks for the post, Alex.
I did try to pass in the partial mock, both in the constructor and through
the AttachShadow method, without luck

-=Chris

On Wed, Mar 25, 2009 at 12:50 AM, Alex McMahon <[email protected]> wrote:

> It seems like the discussion has moved on some, but out of interest it is
> possible to use MSTest private accessors and partial mocks together. I wrote
> a short blog post about it a while ago. I think the key is that the private
> accessor has a constructor that allows you to pass in your partial mock. Now
> this was a while ago with older versions of everything, so I'm not sure it
> still works. Also I completely agree that you probably shouldn't be doing it
> as it is hiding code smells galour.
>
>
> http://icoder.wordpress.com/2007/11/29/using-rhino-mocks-to-test-private-methods-on-an-abstract-class/
>
>
>
>
> On Tue, Mar 24, 2009 at 9:25 PM, Tim Barcz <[email protected]> wrote:
>
>> Another option (better) would be to have your ClassA have a dependency on
>> IFileSystem in the constructor...this would be a more loosely designed
>> application and allow for easier testing.
>>
>>
>> On Tue, Mar 24, 2009 at 4:06 PM, Jake <[email protected]> wrote:
>>
>>>
>>> Ok, I declared this in main project:
>>> public interface IFileSystem
>>> {
>>>  bool FileExists(string filePath);
>>> }
>>>
>>> I've changed implementation on ClassA to following:
>>> public class ClassA:baseClass, IFileSystem
>>> {
>>>  public bool FileExists(string filePath)
>>>  {
>>>   return File.Exists(filePath);
>>>  }
>>> ...
>>>
>>> Now, I would still need to access protected method through
>>> ClassA_AccessorManualClass, as such I've changed the test to
>>> following:
>>>        [TestInitialize()]
>>>        public void MyTestInitialize() {
>>>            _mocks = new MockRepository();
>>>            _classManualAccessorMock =
>>> _mocks.PartialMultiMock<ClassA_AccessorManualClass>(typeof
>>> (IFileSystem));
>>>        }
>>>        //
>>>        // Use TestCleanup to run code after each test has run
>>>        [TestCleanup()]
>>>        public void MyTestCleanup() {
>>>            _mocks.VerifyAll();
>>>        }
>>>        //
>>>        #endregion
>>>
>>>        [TestMethod]
>>>        public void TestProcessItem()
>>>        {
>>>            IFileSystem fs = _classManualAccessorMock;
>>>            Expect.Call(fs.FileExists(null)).IgnoreArguments().Return
>>> (true);
>>>            _mocks.ReplayAll();
>>>            _classManualAccessorMock.ProcessItem(1);
>>>            Assert.AreEqual(true, _classManualAccessorMock.Success);
>>>            Assert.AreEqual("test 1.test",
>>> _classManualAccessorMock.FileName);
>>>        }
>>>
>>> And it is passing now!
>>>
>>> Thank you everyone.
>>>
>>> On Mar 24, 4:45 pm, Tim Barcz <[email protected]> wrote:
>>> > You can then mock IFileSystem.FileExists to return true or false,
>>> allowing
>>> > you to
>>> >
>>> >    1. Not rely on the physical file system where the tests are running
>>> >    2. Tests both paths through this method (1) the file exists 2) the
>>> file
>>> >    doesn't exist and make sure the behavior you want to happen IS in
>>> fact
>>> >    happening.
>>> >
>>> > Tim
>>> >
>>> > On Tue, Mar 24, 2009 at 3:43 PM, Jake <[email protected]> wrote:
>>> >
>>> > > What would I gain by astracting away the interface? If need test to
>>> > > execute something before the call to FileExists and after the call to
>>> > > FileExists then how having interface changes anything?
>>> >
>>> > > On Mar 24, 4:37 pm, Chris Martin <[email protected]> wrote:
>>> > > > Maybe to abstract it away as IFileSystem?
>>> > > > Unfortunately, I really couldn't tell you the best way to do such a
>>> thing
>>> > > > without knowing your project.
>>> >
>>> > > > On Tue, Mar 24, 2009 at 1:35 PM, Jake <[email protected]> wrote:
>>> >
>>> > > > > Ok, I understand that having FileExists as separate method is
>>> "code
>>> > > > > smell", but regardless of that if I need to test functionality
>>> that is
>>> > > > > depended on File.Exists (FileInfo.Exists is another alternative
>>> I've
>>> > > > > tried to use) how can you test that?
>>> >
>>> > > > > On Mar 24, 4:31 pm, Chris Martin <[email protected]> wrote:
>>> > > > > > You really can't unless you completely mock every call in the
>>> chain.
>>> > > > > Which
>>> > > > > > would invalidate any test.
>>> > > > > > I'd take this as a sign that your design isn't sound. :(
>>> >
>>> > > > > > On Tue, Mar 24, 2009 at 12:57 PM, Jake <[email protected]>
>>> wrote:
>>> >
>>> > > > > > > So how can I mock that underlying object to test the
>>> functionality
>>> > > in
>>> > > > > > > ProcessItem?
>>> >
>>> > > > > > > On Mar 24, 3:39 pm, Chris Martin <[email protected]>
>>> wrote:
>>> > > > > > > > Looking under the hood, this is what I can determine:
>>> > > > > > > > MSTest is generating a proxy to the real object under test.
>>> It's
>>> > > only
>>> > > > > > > doing
>>> > > > > > > > this to be able to call the real object. Guess what? The
>>> real
>>> > > object
>>> > > > > in
>>> > > > > > > turn
>>> > > > > > > > calls FileExists, which isn't mocked. The result you're
>>> seing is
>>> > > the
>>> > > > > > > result
>>> > > > > > > > of File.Exists in Sys.IO.
>>> >
>>> > > > > > > > On Tue, Mar 24, 2009 at 12:33 PM, Jake <[email protected]>
>>> > > wrote:
>>> >
>>> > > > > > > > > ClassA_Accessor gets generated on runtime and makes
>>> otherwise
>>> > > > > "hidden"
>>> > > > > > > > > methods and members available for testing. And Yes it is
>>> used
>>> > > by
>>> > > > > > > > > MSTest only.
>>> >
>>> > > > > > > > > On Mar 24, 3:31 pm, Chris Martin <[email protected]>
>>> wrote:
>>> > > > > > > > > > What is ClassA_Accessor?
>>> > > > > > > > > > Is this some "trick" that MSTest relies on?
>>> >
>>> > > > > > > > > > On Tue, Mar 24, 2009 at 12:26 PM, Jake <
>>> [email protected]>
>>> > > > > wrote:
>>> >
>>> > > > > > > > > > > It's in Files in the RhinoMock Group (look on the
>>> > > right-side)
>>> >
>>> > > > > > > > > > > On Mar 24, 3:25 pm, Chris Martin <
>>> [email protected]>
>>> > > wrote:
>>> > > > > > > > > > > > Where is that zip file?
>>> >
>>> > > > > > > > > > > > On Tue, Mar 24, 2009 at 12:23 PM, Jake <
>>> > > [email protected]>
>>> > > > > > > wrote:
>>> >
>>> > > > > > > > > > > > > I uploaded ProtectedMethodCase.zip into files (It
>>> works
>>> > > in
>>> > > > > > > > > > > > > VisualStudio 2008 with Microsoft Test Framework).
>>> I
>>> > > > > implemented
>>> > > > > > > the
>>> > > > > > > > > > > > > test using the PartialMock as was suggested
>>> earlier.
>>> >
>>> > > > > > > > > > > > > On Mar 24, 3:20 pm, Tim Barcz <
>>> [email protected]>
>>> > > wrote:
>>> > > > > > > > > > > > > > It wasn't AAA, I was trying to clarify aruond
>>> > > PartialMock
>>> > > > > but
>>> > > > > > > I
>>> > > > > > > > > think
>>> > > > > > > > > > > I
>>> > > > > > > > > > > > > only
>>> > > > > > > > > > > > > > muddied the waters....
>>> >
>>> > > > > > > > > > > > > > On Tue, Mar 24, 2009 at 2:19 PM, Tuna Toksoz <
>>> > > > > > > [email protected]>
>>> > > > > > > > > > > wrote:
>>> > > > > > > > > > > > > > > I didin't realize it was AAA syntax, because
>>> I saw
>>> > > > > > > ReplayAll,
>>> > > > > > > > > and
>>> > > > > > > > > > > > > though
>>> > > > > > > > > > > > > > > the record/replay mode.
>>> >
>>> > > > > > > > > > > > > > > Tuna Toksöz
>>> > > > > > > > > > > > > > > Eternal sunshine of the open source mind.
>>> >
>>> > > > > > > > > > > > > > >http://devlicio.us/blogs/tuna_toksoz
>>> > > > > > > > > > > > > > >http://tunatoksoz.com
>>> > > > > > > > > > > > > > >http://twitter.com/tehlike
>>> >
>>> > > > > > > > > > > > > > > On Tue, Mar 24, 2009 at 9:08 PM, Chris Martin
>>> <
>>> > > > > > > > > > > [email protected]
>>> > > > > > > > > > > > > >wrote:
>>> >
>>> > > > > > > > > > > > > > >> This won't even compile.
>>> > > > > > > > > > > > > > >> Your methods are protected.
>>> >
>>> > > > > > > > > > > > > > >> Change them to public and this following
>>> passes.
>>> >
>>> > > > > > > > > > > > > > >> ---
>>> > > > > > > > > > > > > > >>     public class ClassA
>>> > > > > > > > > > > > > > >>     {
>>> > > > > > > > > > > > > > >>         public bool Success;
>>> >
>>> > > > > > > > > > > > > > >>         public virtual bool
>>> FileExists(string
>>> > > > > filename)
>>> > > > > > > > > > > > > > >>         {
>>> > > > > > > > > > > > > > >>             return File.Exists(filename);
>>> > > > > > > > > > > > > > >>         }
>>> >
>>> > > > > > > > > > > > > > >>         public virtual void Process(string
>>> > > filename)
>>> > > > > > > > > > > > > > >>         {
>>> > > > > > > > > > > > > > >>             Success = FileExists(filename);
>>> > > > > > > > > > > > > > >>         }
>>> > > > > > > > > > > > > > >>     }
>>> >
>>> > > > > > > > > > > > > > >>     [TestFixture]
>>> > > > > > > > > > > > > > >>     public class Tests
>>> > > > > > > > > > > > > > >>     {
>>> > > > > > > > > > > > > > >>         [Test]
>>> > > > > > > > > > > > > > >>         public void process_test()
>>> > > > > > > > > > > > > > >>         {
>>> > > > > > > > > > > > > > >>             var mocks = new
>>> MockRepository();
>>> >
>>> > > > > > > > > > > > > > >>             var a =
>>> mocks.PartialMock<ClassA>();
>>> >
>>> > >  Expect.Call(a.FileExists(null)).IgnoreArguments().Return(true);
>>> > > > > > > > > > > > > > >>             mocks.ReplayAll();
>>> >
>>> > > > > > > > > > > > > > >>             a.Process("test.test");
>>> >
>>> > > > > > > > > > > > > > >>             Assert.AreEqual(a.Success,
>>> true);
>>> > > > > > > > > > > > > > >>         }
>>> > > > > > > > > > > > > > >>     }
>>> >
>>> > > > > > > > > > > > > > >> On Tue, Mar 24, 2009 at 10:50 AM, Jake <
>>> > > > > [email protected]
>>> >
>>> > > > > > > > > wrote:
>>> >
>>> > > > > > > > > > > > > > >>> Sorry, for this mistake, but method is
>>> virtual!
>>> > > > > > > > > > > > > > >>> Here is more info:
>>> >
>>> > > > > > > > > > > > > > >>> public class classA: baseClass
>>> > > > > > > > > > > > > > >>> {
>>> >
>>> > > > > > > > > > > > > > >>>   public bool Success;
>>> >
>>> > > > > > > > > > > > > > >>>   protected virtual bool FileExists(string
>>> > > fileName)
>>> > > > > > > > > > > > > > >>>   {
>>> > > > > > > > > > > > > > >>>      return File.Exists(fileName);
>>> > > > > > > > > > > > > > >>>   }
>>> >
>>> > > > > > > > > > > > > > >>>   protected virtual void Process(string
>>> fileName)
>>> > > > > > > > > > > > > > >>>   {
>>> > > > > > > > > > > > > > >>>     //Do something
>>> > > > > > > > > > > > > > >>>     if(FileExists(fileName))
>>> > > > > > > > > > > > > > >>>      {
>>> > > > > > > > > > > > > > >>>       Success = true;
>>> > > > > > > > > > > > > > >>>      }
>>> > > > > > > > > > > > > > >>>     else
>>> > > > > > > > > > > > > > >>>     {
>>> > > > > > > > > > > > > > >>>      Success = false;
>>> > > > > > > > > > > > > > >>>     }
>>> > > > > > > > > > > > > > >>>  }
>>> > > > > > > > > > > > > > >>> }
>>> >
>>> > > > > > > > > > > > > > >>> Unit test:
>>> >
>>> > > > > > > > > > > > > > >>> [TestMethod]
>>> > > > > > > > > > > > > > >>> public void ProcessTest()
>>> > > > > > > > > > > > > > >>> {
>>> > > > > > > > > > > > > > >>>    var a = _mocks.StrickMock<baseClass>();
>>> >
>>> > > > >  Expect.Call(a.FileExists(null)).IgnoreArguments().Return(true);
>>> > > > > > > > > > > > > > >>>    _mocks.ReplayAll();
>>> > > > > > > > > > > > > > >>>   a.Process("test.test"); //File doesn't
>>> exists
>>> > > > > > > > > > > > > > >>>   Assert.AreEqual(true, a.Success); //Fails
>>> here
>>> > > > > > > > > > > > > > >>> }
>>> >
>>> > > > > > > > > > > > > > >>> On Mar 24, 1:39 pm, Alex McMahon <
>>> > > > > [email protected]>
>>> > > > > > > > > wrote:
>>> > > > > > > > > > > > > > >>> > Method2 must be a virtual method for
>>> RhinoMocks
>>> > > to
>>> > > > > be
>>> > > > > > > able
>>> > > > > > > > > to
>>> > > > > > > > > > > mock
>>> > > > > > > > > > > > > the
>>> > > > > > > > > > > > > > >>> > method with a PartialMock,
>>> >
>>> > > > > > > > > > > > > > >>> > On Tue, Mar 24, 2009 at 5:21 PM, Jake <
>>> > > > > > > [email protected]>
>>> > > > > > > > > > > wrote:
>>> >
>>> > > > > > > > > > > > > > >>> > > Ayende,
>>> > > > > > > > > > > > > > >>> > > I am trying to use Rhino Mocks in
>>> following
>>> > > > > scenario:
>>> >
>>> > > > > > > > > > > > > > >>> > > void classA.Method1()
>>> > > > > > > > > > > > > > >>> > > {
>>> > > > > > > > > > > > > > >>> > >    //some stuff
>>> > > > > > > > > > > > > > >>> > >    if(classA.Method2(var))
>>> > > > > > > > > > > > > > >>> > >    {
>>> > > > > > > > > > > > > > >>> > >        //Do something
>>> > > > > > > > > > > > > > >>> > >  }
>>> > > > > > > > > > > > > > >>> > >    else
>>> > > > > > > > > > > > > > >>> > >  {
>>> > > > > > > > > > > > > > >>> > >     //Do something else
>>> > > > > > > > > > > > > > >>> > >  }
>>> > > > > > > > > > > > > > >>> > >    //some other stuff
>>> > > > > > > > > > > > > > >>> > > }
>>> >
>>> > > > > > > > > > > > > > >>> > > Now, I created partial mock for the
>>> class and
>>> > > set
>>> > > > > > > > > expectation
>>> > > > > > > > > > > for
>>> > > > > > > > > > > > > > >>> > > Method2 like so:
>>> >
>>> > > > >
>>> Expect.Call(classAMock.Method2(null)).IgnoreArguments().Return(true);
>>> >
>>> > > > > > > > > > > > > > >>> > > Real implementation of the method
>>> returns
>>> > > false.
>>> >
>>> > > > > > > > > > > > > > >>> > > When I execute the test it goes through
>>> the
>>> > > path
>>> > > > > when
>>> > > > > > > > > Method2
>>> > > > > > > > > > > > > returns
>>> > > > > > > > > > > > > > >>> > > false.
>>> >
>>> > > > > > > > > > > > > > >>> > > How can that be?
>>> >
>>> > > > > > > > > > > > > > >> --
>>> >
>>> > > > > > > > > > > > > > >> Charles Kettering  - "My interest is in the
>>> future
>>> > > > > because
>>> > > > > > > I
>>> > > > > > > > > am
>>> > > > > > > > > > > going
>>> > > > > > > > > > > > > to
>>> > > > > > > > > > > > > > >> spend the rest of my life there."
>>> >
>>> > ...
>>> >
>>> > read more »
>>>
>>>
>>
>>
>>
>
> >
>


-- 

George Burns  - "Don't stay in bed, unless you can make money in bed."

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Rhino.Mocks" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/RhinoMocks?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to