xUnit to replace thirdParty class instance with a fake one












2














Part of my class initialize an object to an MLM ( which required a lot of setups and installations) what I need is to replace it
with a fake object to Do the same in an easy way,



For example how to test the following code with a fake object



// LMXProxyServerClass is the library in which need a lot of installation 
private readonly LMXProxyServerClass lmxProxyServer;


And this is an example of one of the methods I use in



private bool CreateBindingWithoutPropagate(string attributeName, bool supervisory)
{
bool creatingBindingResult = false;

lock (mxAccessProxyLock)
{

if (!bindings.ContainsKey(attributeName))
{
try
{
logger.Debug("Adding item " + attributeName + " to bindings, not in list so add.");

// Add the handle to the mapping
lmxHandleToAttributeNameMapping.Add(attributeBinding.MxAttributeHandle, attributeName);

if (supervisory)
{
lmxProxyServer.DoSOmethingElse(yyyyyyyyyyyyyyyyyyyyyyy);
logger.Info(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx);
}
else
{

lmxProxyServer.DoSOmething(xxxxxxxx);
logger.Info(xxxxxxxxxxx);
}

// Add the binding to the list of bindings.
bindings.Add(attributeName, attributeBinding);

logger.Info("Creating binding for: " + attributeName);

creatingBindingResult = true;

}
catch (System.UnauthorizedAccessException unauthorizedAccessException)
{

logger.Error("xxxxxxxxxxx", attributeName);
throw ConvertExceptionToFault(unauthorizedAccessException);

}
catch (Exception ex)
{
throw ConvertExceptionToFault(ex);
}
}
}

return creatingBindingResult;
}


This library is third-party one so I have no control over it, so in testing I need to replace this object with fake one so I don't change a lot in the base code and ease the testing of other parts










share|improve this question





























    2














    Part of my class initialize an object to an MLM ( which required a lot of setups and installations) what I need is to replace it
    with a fake object to Do the same in an easy way,



    For example how to test the following code with a fake object



    // LMXProxyServerClass is the library in which need a lot of installation 
    private readonly LMXProxyServerClass lmxProxyServer;


    And this is an example of one of the methods I use in



    private bool CreateBindingWithoutPropagate(string attributeName, bool supervisory)
    {
    bool creatingBindingResult = false;

    lock (mxAccessProxyLock)
    {

    if (!bindings.ContainsKey(attributeName))
    {
    try
    {
    logger.Debug("Adding item " + attributeName + " to bindings, not in list so add.");

    // Add the handle to the mapping
    lmxHandleToAttributeNameMapping.Add(attributeBinding.MxAttributeHandle, attributeName);

    if (supervisory)
    {
    lmxProxyServer.DoSOmethingElse(yyyyyyyyyyyyyyyyyyyyyyy);
    logger.Info(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx);
    }
    else
    {

    lmxProxyServer.DoSOmething(xxxxxxxx);
    logger.Info(xxxxxxxxxxx);
    }

    // Add the binding to the list of bindings.
    bindings.Add(attributeName, attributeBinding);

    logger.Info("Creating binding for: " + attributeName);

    creatingBindingResult = true;

    }
    catch (System.UnauthorizedAccessException unauthorizedAccessException)
    {

    logger.Error("xxxxxxxxxxx", attributeName);
    throw ConvertExceptionToFault(unauthorizedAccessException);

    }
    catch (Exception ex)
    {
    throw ConvertExceptionToFault(ex);
    }
    }
    }

    return creatingBindingResult;
    }


    This library is third-party one so I have no control over it, so in testing I need to replace this object with fake one so I don't change a lot in the base code and ease the testing of other parts










    share|improve this question



























      2












      2








      2


      0





      Part of my class initialize an object to an MLM ( which required a lot of setups and installations) what I need is to replace it
      with a fake object to Do the same in an easy way,



      For example how to test the following code with a fake object



      // LMXProxyServerClass is the library in which need a lot of installation 
      private readonly LMXProxyServerClass lmxProxyServer;


      And this is an example of one of the methods I use in



      private bool CreateBindingWithoutPropagate(string attributeName, bool supervisory)
      {
      bool creatingBindingResult = false;

      lock (mxAccessProxyLock)
      {

      if (!bindings.ContainsKey(attributeName))
      {
      try
      {
      logger.Debug("Adding item " + attributeName + " to bindings, not in list so add.");

      // Add the handle to the mapping
      lmxHandleToAttributeNameMapping.Add(attributeBinding.MxAttributeHandle, attributeName);

      if (supervisory)
      {
      lmxProxyServer.DoSOmethingElse(yyyyyyyyyyyyyyyyyyyyyyy);
      logger.Info(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx);
      }
      else
      {

      lmxProxyServer.DoSOmething(xxxxxxxx);
      logger.Info(xxxxxxxxxxx);
      }

      // Add the binding to the list of bindings.
      bindings.Add(attributeName, attributeBinding);

      logger.Info("Creating binding for: " + attributeName);

      creatingBindingResult = true;

      }
      catch (System.UnauthorizedAccessException unauthorizedAccessException)
      {

      logger.Error("xxxxxxxxxxx", attributeName);
      throw ConvertExceptionToFault(unauthorizedAccessException);

      }
      catch (Exception ex)
      {
      throw ConvertExceptionToFault(ex);
      }
      }
      }

      return creatingBindingResult;
      }


      This library is third-party one so I have no control over it, so in testing I need to replace this object with fake one so I don't change a lot in the base code and ease the testing of other parts










      share|improve this question















      Part of my class initialize an object to an MLM ( which required a lot of setups and installations) what I need is to replace it
      with a fake object to Do the same in an easy way,



      For example how to test the following code with a fake object



      // LMXProxyServerClass is the library in which need a lot of installation 
      private readonly LMXProxyServerClass lmxProxyServer;


      And this is an example of one of the methods I use in



      private bool CreateBindingWithoutPropagate(string attributeName, bool supervisory)
      {
      bool creatingBindingResult = false;

      lock (mxAccessProxyLock)
      {

      if (!bindings.ContainsKey(attributeName))
      {
      try
      {
      logger.Debug("Adding item " + attributeName + " to bindings, not in list so add.");

      // Add the handle to the mapping
      lmxHandleToAttributeNameMapping.Add(attributeBinding.MxAttributeHandle, attributeName);

      if (supervisory)
      {
      lmxProxyServer.DoSOmethingElse(yyyyyyyyyyyyyyyyyyyyyyy);
      logger.Info(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx);
      }
      else
      {

      lmxProxyServer.DoSOmething(xxxxxxxx);
      logger.Info(xxxxxxxxxxx);
      }

      // Add the binding to the list of bindings.
      bindings.Add(attributeName, attributeBinding);

      logger.Info("Creating binding for: " + attributeName);

      creatingBindingResult = true;

      }
      catch (System.UnauthorizedAccessException unauthorizedAccessException)
      {

      logger.Error("xxxxxxxxxxx", attributeName);
      throw ConvertExceptionToFault(unauthorizedAccessException);

      }
      catch (Exception ex)
      {
      throw ConvertExceptionToFault(ex);
      }
      }
      }

      return creatingBindingResult;
      }


      This library is third-party one so I have no control over it, so in testing I need to replace this object with fake one so I don't change a lot in the base code and ease the testing of other parts







      c# unit-testing xunit.net






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 21 '18 at 15:53









      Mark Seemann

      182k33323559




      182k33323559










      asked Nov 21 '18 at 9:21









      AliAli

      91652345




      91652345
























          1 Answer
          1






          active

          oldest

          votes


















          2














          Tightly coupling code to 3rd party implementation concerns make it difficult to unit test the code in isolation.



          Instead encapsulate 3rd party implementation concern in an abstraction that can be mocked as needed when testing.



          For example, create an abstraction of the 3rd party dependency, exposing only what is needed by your code.



          public interface ILMXProxyServer {
          void DoSOmethingElse(...);
          void DoSOmething(...);
          //...
          }


          and have that explicitly injected into dependents via constructor injection.



          public class MyClass {
          private readonly ILMXProxyServer lmxProxyServer;

          public MyClass(ILMXProxyServer lmxProxyServer) {
          this.lmxProxyServer = lmxProxyServer;
          }

          //...other code omitted for brevity
          }


          The methods remain the same as they will call exposed members of the abstraction.



          The run time implementation will wrap/encapsulate the 3rd party dependency



          public class MyLMXProxyServerWrapper : ILMXProxyServer {
          // LMXProxyServerClass is the library in which need a lot of installation
          private readonly LMXProxyServerClass lmxProxyServer;


          public void DoSOmething(Something xxxxxxx){
          lmxProxyServer.DoSOmething(xxxxxxxx);
          }

          //...code omitted for brevity
          }


          With that refactor the code is now more flexible to be able to mock/fake the proxy server when testing in isolation using your mocking framework of choice or by rolling your own implementations specific for testing.






          share|improve this answer























          • it's a brilliant idea, what am thinking bout how to implement this and passing the value as I use topshelf to host this wcf service
            – Ali
            Nov 21 '18 at 11:44










          • @Ali Research Dependency Inversion. If unable to use an IoC container then Pure DI can still work wonders.
            – Nkosi
            Nov 21 '18 at 12:38













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53408772%2fxunit-to-replace-thirdparty-class-instance-with-a-fake-one%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          2














          Tightly coupling code to 3rd party implementation concerns make it difficult to unit test the code in isolation.



          Instead encapsulate 3rd party implementation concern in an abstraction that can be mocked as needed when testing.



          For example, create an abstraction of the 3rd party dependency, exposing only what is needed by your code.



          public interface ILMXProxyServer {
          void DoSOmethingElse(...);
          void DoSOmething(...);
          //...
          }


          and have that explicitly injected into dependents via constructor injection.



          public class MyClass {
          private readonly ILMXProxyServer lmxProxyServer;

          public MyClass(ILMXProxyServer lmxProxyServer) {
          this.lmxProxyServer = lmxProxyServer;
          }

          //...other code omitted for brevity
          }


          The methods remain the same as they will call exposed members of the abstraction.



          The run time implementation will wrap/encapsulate the 3rd party dependency



          public class MyLMXProxyServerWrapper : ILMXProxyServer {
          // LMXProxyServerClass is the library in which need a lot of installation
          private readonly LMXProxyServerClass lmxProxyServer;


          public void DoSOmething(Something xxxxxxx){
          lmxProxyServer.DoSOmething(xxxxxxxx);
          }

          //...code omitted for brevity
          }


          With that refactor the code is now more flexible to be able to mock/fake the proxy server when testing in isolation using your mocking framework of choice or by rolling your own implementations specific for testing.






          share|improve this answer























          • it's a brilliant idea, what am thinking bout how to implement this and passing the value as I use topshelf to host this wcf service
            – Ali
            Nov 21 '18 at 11:44










          • @Ali Research Dependency Inversion. If unable to use an IoC container then Pure DI can still work wonders.
            – Nkosi
            Nov 21 '18 at 12:38


















          2














          Tightly coupling code to 3rd party implementation concerns make it difficult to unit test the code in isolation.



          Instead encapsulate 3rd party implementation concern in an abstraction that can be mocked as needed when testing.



          For example, create an abstraction of the 3rd party dependency, exposing only what is needed by your code.



          public interface ILMXProxyServer {
          void DoSOmethingElse(...);
          void DoSOmething(...);
          //...
          }


          and have that explicitly injected into dependents via constructor injection.



          public class MyClass {
          private readonly ILMXProxyServer lmxProxyServer;

          public MyClass(ILMXProxyServer lmxProxyServer) {
          this.lmxProxyServer = lmxProxyServer;
          }

          //...other code omitted for brevity
          }


          The methods remain the same as they will call exposed members of the abstraction.



          The run time implementation will wrap/encapsulate the 3rd party dependency



          public class MyLMXProxyServerWrapper : ILMXProxyServer {
          // LMXProxyServerClass is the library in which need a lot of installation
          private readonly LMXProxyServerClass lmxProxyServer;


          public void DoSOmething(Something xxxxxxx){
          lmxProxyServer.DoSOmething(xxxxxxxx);
          }

          //...code omitted for brevity
          }


          With that refactor the code is now more flexible to be able to mock/fake the proxy server when testing in isolation using your mocking framework of choice or by rolling your own implementations specific for testing.






          share|improve this answer























          • it's a brilliant idea, what am thinking bout how to implement this and passing the value as I use topshelf to host this wcf service
            – Ali
            Nov 21 '18 at 11:44










          • @Ali Research Dependency Inversion. If unable to use an IoC container then Pure DI can still work wonders.
            – Nkosi
            Nov 21 '18 at 12:38
















          2












          2








          2






          Tightly coupling code to 3rd party implementation concerns make it difficult to unit test the code in isolation.



          Instead encapsulate 3rd party implementation concern in an abstraction that can be mocked as needed when testing.



          For example, create an abstraction of the 3rd party dependency, exposing only what is needed by your code.



          public interface ILMXProxyServer {
          void DoSOmethingElse(...);
          void DoSOmething(...);
          //...
          }


          and have that explicitly injected into dependents via constructor injection.



          public class MyClass {
          private readonly ILMXProxyServer lmxProxyServer;

          public MyClass(ILMXProxyServer lmxProxyServer) {
          this.lmxProxyServer = lmxProxyServer;
          }

          //...other code omitted for brevity
          }


          The methods remain the same as they will call exposed members of the abstraction.



          The run time implementation will wrap/encapsulate the 3rd party dependency



          public class MyLMXProxyServerWrapper : ILMXProxyServer {
          // LMXProxyServerClass is the library in which need a lot of installation
          private readonly LMXProxyServerClass lmxProxyServer;


          public void DoSOmething(Something xxxxxxx){
          lmxProxyServer.DoSOmething(xxxxxxxx);
          }

          //...code omitted for brevity
          }


          With that refactor the code is now more flexible to be able to mock/fake the proxy server when testing in isolation using your mocking framework of choice or by rolling your own implementations specific for testing.






          share|improve this answer














          Tightly coupling code to 3rd party implementation concerns make it difficult to unit test the code in isolation.



          Instead encapsulate 3rd party implementation concern in an abstraction that can be mocked as needed when testing.



          For example, create an abstraction of the 3rd party dependency, exposing only what is needed by your code.



          public interface ILMXProxyServer {
          void DoSOmethingElse(...);
          void DoSOmething(...);
          //...
          }


          and have that explicitly injected into dependents via constructor injection.



          public class MyClass {
          private readonly ILMXProxyServer lmxProxyServer;

          public MyClass(ILMXProxyServer lmxProxyServer) {
          this.lmxProxyServer = lmxProxyServer;
          }

          //...other code omitted for brevity
          }


          The methods remain the same as they will call exposed members of the abstraction.



          The run time implementation will wrap/encapsulate the 3rd party dependency



          public class MyLMXProxyServerWrapper : ILMXProxyServer {
          // LMXProxyServerClass is the library in which need a lot of installation
          private readonly LMXProxyServerClass lmxProxyServer;


          public void DoSOmething(Something xxxxxxx){
          lmxProxyServer.DoSOmething(xxxxxxxx);
          }

          //...code omitted for brevity
          }


          With that refactor the code is now more flexible to be able to mock/fake the proxy server when testing in isolation using your mocking framework of choice or by rolling your own implementations specific for testing.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 21 '18 at 16:05

























          answered Nov 21 '18 at 9:50









          NkosiNkosi

          111k16122188




          111k16122188












          • it's a brilliant idea, what am thinking bout how to implement this and passing the value as I use topshelf to host this wcf service
            – Ali
            Nov 21 '18 at 11:44










          • @Ali Research Dependency Inversion. If unable to use an IoC container then Pure DI can still work wonders.
            – Nkosi
            Nov 21 '18 at 12:38




















          • it's a brilliant idea, what am thinking bout how to implement this and passing the value as I use topshelf to host this wcf service
            – Ali
            Nov 21 '18 at 11:44










          • @Ali Research Dependency Inversion. If unable to use an IoC container then Pure DI can still work wonders.
            – Nkosi
            Nov 21 '18 at 12:38


















          it's a brilliant idea, what am thinking bout how to implement this and passing the value as I use topshelf to host this wcf service
          – Ali
          Nov 21 '18 at 11:44




          it's a brilliant idea, what am thinking bout how to implement this and passing the value as I use topshelf to host this wcf service
          – Ali
          Nov 21 '18 at 11:44












          @Ali Research Dependency Inversion. If unable to use an IoC container then Pure DI can still work wonders.
          – Nkosi
          Nov 21 '18 at 12:38






          @Ali Research Dependency Inversion. If unable to use an IoC container then Pure DI can still work wonders.
          – Nkosi
          Nov 21 '18 at 12:38




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53408772%2fxunit-to-replace-thirdparty-class-instance-with-a-fake-one%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Create new schema in PostgreSQL using DBeaver

          Deepest pit of an array with Javascript: test on Codility

          Fotorealismo